我需要做的是解压缩一个文件,(.gz或.z),读取第一行并根据第一行读取做一些事情.但是C标准库似乎没有提供这样做的方法.
这是一种独立于平台的方式吗?
我正在研究编写玩具编程语言的爱好,部分原因是对其他语言的轻微烦恼,部分原因是为了让我能够理解它是什么样的,但大多只是为了愚弄.
关于它变得非常有用的机会,我不希望它依赖于另一种编程语言的运行时来运行它编写的程序.也就是说,我希望解释器/编译器本身是一个本地编译到目标OS中的程序(语言本身可以解释/提供运行时).
除了C之外还有其他替代方法吗?有哪些优点/缺点或使用每个?
澄清1:我不打算低级写入内核,文件系统,设备驱动程序,引导加载程序.但是,我希望能够管理自己的记忆.
澄清2:由于术语错误/误解,并且由于我习惯于在各种操作系统上运行的C运行时,我说C没有运行时/和/或者我对运行时不感兴趣.更好的方式来说明我真正想要的是我的程序本地编译到目标(桌面)操作系统,而无需从引导语言安装其他软件.
2.1:如果我在python中编写编译器/解释器,我不希望发出的可执行文件依赖于python程序.
2.2:如果我使用编译步骤,例如,使用perl编译程序,我不希望发出的可执行文件依赖于libperl.dll/so.
2.3:运行时的例外情况是C,因为C运行时通常安装在几乎所有的桌面操作系统上,因为许多核心操作系统工具依赖它.
编译器:linux上的clang ++ x86-64.
已经有一段时间了,因为我编写了任何复杂的低级系统代码,并且我对系统原语(windows和pthreads/posix)进行了编程.所以,#s和out的内容已经从我的记忆中消失了.我正在boost::asio和boost::thread目前一起工作.
为了模拟针对异步函数执行器的同步RPC(在请求被编辑的地方boost::io_service有多个线程),我正在使用boost同步原语.为了好奇,我决定使用这些原语.这就是我所看到的.io::service::runio_serviced::postsizeof
struct notification_object
{
bool ready;
boost::mutex m;
boost::condition_variable v;
};
...
std::cout << sizeof(bool) << std::endl;
std::cout << sizeof(boost::mutex) << std::endl;
std::cout << sizeof(boost::condition_variable) << std::endl;
std::cout << sizeof(notification_object) << std::endl;
...
Run Code Online (Sandbox Code Playgroud)
输出:
1
40
88
136
Run Code Online (Sandbox Code Playgroud)
互斥锁的四十个字节?? ?? ?WTF!88为条件_变量!!! 请记住,我被这个体积臃肿击退,因为我想,可能造成上百的应用程序notification_object的
这种便携性开销似乎很荒谬,有人可以证明这一点吗?据我所知,这些原语应该是4或8字节宽,具体取决于CPU的内存模型.
c++ boost-thread micro-optimization boost-asio systems-programming
我想检查文件是目录,链接还是仅仅是常规文件.我遍历目录并将每个文件保存为struct dirent *.我试图传递d_ino给S_ISDIR(m),, S_ISLINK(m)或者S_ISREG(m)无论文件如何,我都不会得到积极的结果.所以我的问题是:我怎么使用S_ISDIR(m)带struct dirent?
我在我的程序中使用以下系统调用:
recvfrom
sendto
sendmsg
Run Code Online (Sandbox Code Playgroud)
从上面提到的每个系统调用我检查它是否完成没有任何中断,如果它被中断,我重试.
例如:
recvagain:
len = recvfrom(fd, response, MSGSIZE, MSG_WAITALL, (struct sockaddr *)&from, &fromlen);
if (errno == EINTR) {
syslog(LOG_NOTICE, "recvfrom interrupted: %s", strerror(errno));
goto recvagain;
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是我需要在每次失败时将errno值重置为0.或者如果recvfrom()成功,它会将errno重置为0吗?
recvfrom()手册页说:
成功完成后,recvfrom()以字节为单位返回消息的长度.如果没有可接收的消息且对等体已执行有序关闭,则recvfrom()返回0.否则该函数返回-1并设置errno以指示错误.
与sendto和sendmsg相同的情况.
我现在无法真正检查这个,因为我无法访问服务器 - 客户端设置.任何的想法?
谢谢
我阅读cat /proc/[pid]/maps了有关其地址空间的信息.所以我想编写一个程序来打印自己的地址空间.
我的节目是这样的;
pid_t pid;
int fd;
char *buf;
pid = getpid();
fd = open("/proc/????/maps", O_RDONLY);
Run Code Online (Sandbox Code Playgroud)
我正在获取PID,但它无法帮助我打开文件.如何将pid转换pid_t为字符串并将其添加到open调用?
或者有没有其他方法来打开文件?
在小孩,我写入fifo"样本",并在父母中阅读.在下面的代码中,父写入终端"sample"并等待,它不会退出读取功能.
pid_t p;
int fd;
char str[]="sample";
char ch;
mkfifo("myfifo", FIFO_PERMS);
fd = open("myfifo", O_RDWR);
p=fork();
if(!p){
printf("write %d byte\n", write(fd, str, 6));
}
else{
wait(NULL);
while(read(fd, &ch, 1)>0)
write(STDOUT_FILENO, &ch, 1);
close(fd);
unlink("myfifo");
}
Run Code Online (Sandbox Code Playgroud) 在一个终端我可以打电话ls -d */.现在我想要一个c程序为我这样做,像这样:
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
int main( void )
{
int status;
char *args[] = { "/bin/ls", "-l", NULL };
if ( fork() == 0 )
execv( args[0], args );
else
wait( &status );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这将是ls -l一切.但是,当我尝试时:
char *args[] = { "/bin/ls", "-d", "*/", NULL };
Run Code Online (Sandbox Code Playgroud)
我会得到一个运行时错误:
ls:*/:没有这样的文件或目录
我正在学习linux系统编程,O'reilly.它说:"一个常见的错误是将缓冲区声明为在流关闭之前结束的范围内的自动变量.特别是,注意不要在main()本地提供缓冲区,然后无法显式关闭流. "
然后它显示了一个错误的代码示例:
#include <stdio.h>
int main()
{
char buf[BUFSIZ];
/*set stdin to block-buffered with a BUFSIZ buffer*/
setvbuf(stdout,buf,_IOFBF,BUFSIZ);
printf("Arr!\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我编译并执行代码..并没有真正理解这种代码会导致什么...请帮助我理解这个概念,谢谢大家.
我想在目录中找到与给定模式匹配的所有文件,例如A,并且不匹配给定模式,如B
我尝试了什么:做"ls -I B"给了我所有与模式B匹配的文件.但是我没有得到任何关于如何做我想做的线索.
c ×8
linux ×4
c++ ×2
bash ×1
boost-asio ×1
boost-thread ×1
buffer ×1
find ×1
fork ×1
low-level ×1
named-pipes ×1
proc ×1
shell ×1
system-calls ×1
unix ×1
unzip ×1