C – 检索大于8位的子退出状态

注意:为简单起见,我没有包含太多错误检查,我的示例代码实际上没有任何实际用途。

我想要的是:

我想要一个fork()是一个子进程的程序,并让它使用execl()调用一个进程。 然后我的父母检索该进程的退出代码。 这是相当微不足道的。

我尝试了什么:

 int main(int argc, char** argv) { int ch = fork(); if(ch == -1) { perror(NULL); }else if(ch == 0) { // In child, invoke process execl("/path/process", "process", 0); }else { // In parent, retrieve child exit code int status = 0; wait(&status); // print exit status if(WIFEXITED(status)) printf("%d\n", WEXITSTATUS(status)); } } 

我的问题:

WEXITSTATUS()仅检索退出值的低8位,而我需要int值中的所有位。 具体地, process执行计算,结果可能大于8位。 它甚至可能是负的,在这种情况下,需要最高位来表示正确的值。

我还尝试了什么:

另外,环顾四周时,我找到了pipe()函数。 但是,我不确定如何在这种情况下使用它,因为在调用execl() ,我无法从子内部写入文件描述符。

那么我怎样才能检索一个大于8位的子退出状态呢?

我不认为你想要实现它的可能性,因为在Linux中(实际上我认为它是UX特定的),进程退出代码是8位数(最大256):0-255(并且作为约定,0意味着成功,其他任何意味着错误)很多东西都依赖于这个事实(包括你使用的宏)。 采取以下代码:

 // ac int main() { return 257; } 

如果你编译它( gcc ac ),并运行生成的可执行文件( a.out )检查( echo $? )它的退出代码(将被操作系统截断;嗯还是shell?)它将输出1(环绕算术):257%256 = 1。

作为您提到的替代方法,您可以使用pipe ( 此post非常具有描述性)或套接字( AF_UNIX类型)。

此代码来自: 如何使用管道在两个程序之间发送一个简单的字符串?

writer.c

 #include  #include  #include  #include  int main() { int fd; char * myfifo = "/tmp/myfifo"; /* create the FIFO (named pipe) */ mkfifo(myfifo, 0666); /* write "Hi" to the FIFO */ fd = open(myfifo, O_WRONLY); write(fd, "Hi", sizeof("Hi")); close(fd); /* remove the FIFO */ unlink(myfifo); return 0; } 

reader.c

 #include  #include  #include  #include  #define MAX_BUF 1024 int main() { int fd; char * myfifo = "/tmp/myfifo"; char buf[MAX_BUF]; /* open, read, and display the message from the FIFO */ fd = open(myfifo, O_RDONLY); read(fd, buf, MAX_BUF); printf("Received: %s\n", buf); close(fd); return 0; } 

代码,可能是父/读者,应该删除fifo节点,可能是通过调用rm 。 否则,即使在重新启动时,fifo条目仍然存在,就像任何其他文件一样。