Tag: 系统调用

如何检查errno的值?

我正在使用系统调用,如果失败,我需要为不同的errnos做不同的事情。 我需要编写看起来像这样的代码: int res; res = systemCall(); if (res == -1) { if (errno == ENOMSG) { doSomething(); } else { doSomethingElse(); } } perror没有帮助,因为它只打印值。 至于strerro – 如果它是我需要的,我不是如何使用它,因为在这里它说实际的字符串与错误不同。 从手册页引用:“(例如,如果errnum是EINVAL,则返回的描述将是”无效参数“)”。 我正在使用Linux。 系统调用:msgsend和msgrcv( https://linux.die.net/man/2/msgrcv )。 我不确定你问的C库是什么。 我看到我没有很好地解释自己。 语句if(errno == ENOMSG)是否有效? 有这样一个变量errno? 基本上我的问题是:为了测试errno, if语句应该怎么做?

捕获系统调用标准输出而无需在C / C ++中写入文件

我想将系统调用的std输出读入C / C ++字符串。 我可以不使用临时文件吗? Perl的 //without file io $output = `echo hello`; C ++ //with file io system (“echo hello > tmp”); std::fstream file (“tmp”); std::string s; file >> s;

直接从用户程序访问系统调用

在Ubuntu上 – 内核2.6.32.2 如何在没有任何库帮助的情况下直接从用户代码调用已有的系统调用? 我读书和在互联网上解决这个问题,然后写下面的代码但仍然出错。 请帮忙 想要找出当前进程的进程ID #include #include // for __NR_getpid _syscall0(int, getpid) int main() { printf(“Current Process ID : %d\n”,getpid()); return 0; } 编译时出错: root@Omkant:~/os# gcc -Wall getpid.c -o getpid getpid.c:5:16: error: expected declaration specifiers or ‘…’ before ‘getpid’ getpid.c:5:1: warning: data definition has no type or storage class getpid.c:5:1: warning: type defaults […]

退出的Syscall实现()

我写了一个简单的C程序,只调用exit()函数,但是strace说二进制文件实际上是调用exit_group,exit()是一个exit_group()包装器吗? 这两个function是否相同? 如果是这样,为什么编译器会选择exit_group()而不是exit()?

系统调用与函数调用

系统调用和函数调用有什么区别? fopen()是系统调用还是函数调用?

在退出()状态下使用C中的WEXITSTATUS宏超过256的任何好处?

我正在为大学做一个练习,我必须用退出返回一个值,这个值实际上是一些东西。 这可能高于255(exit()无法处理)但是老师建议使用测试数据,其中计数永远不会高于该值。 毕竟,我需要处理这个计数值,退出状态,我通过使用waitpid()在主进程中得到了这个值。 令我惊讶的是,如果子进程返回1,则主进程中的“实际”值为256,2为512,依此类推…… 我需要打印这个值,所以我简单地将它除以256并完成了。 但是,如果我使用WEXITSTATUS()宏,我也会按照我想要的方式得到这个值… 我查看了C源代码,这是我发现的: #define __WEXITSTATUS(status) (((status) & 0xff00) >> 8) 我理解这里发生了什么,例如,512 in binary是10 0000 0000,右移8 o将给00 0000 0010,即十进制2。 我在这个宏中不明白的是&运算符和0xff00似乎是一个随机数的事实(它可能不是,它来自哪里?)。 这究竟是做什么的,为什么宏中有“&0xff00”? 它不会有效吗? 在这个主题中真正的问题是,在我的代码中将此宏称为除以256是一回事吗?

让父母等待所有子进程完成

我希望有人可以说明如何让父母等待所有子进程完成后继续fork之后。 我有清理代码,我想运行但子进程需要返回才能发生这种情况。 for (int id=0; id<n; id++) { if (fork()==0) { // Child exit(0); } else { // Parent … } … }