Linux中的Wait(&status)系统调用

我在linux中执行此程序,但无法通过wait(&val)系统调用了解程序的输出


#include <sys/types.h>

#include <sys/wait.h>

#include <stdio.h>

int main(void)

{

    int val = 5;

    if (fork())

        wait(&val);

    val++;

    printf("%d\n", val);

    return val;

}

huzee98@ubuntu:~$ ./task2a 

1537


杨魅力
浏览 404回答 1
1回答

翻阅古今

在子级中,您的程序只需将1加5,产生6,打印6,然后返回6作为退出状态。在父级中,wait(&val)成功返回后,将val包含一个魔术cookie。孩子的退出状态被编码在这个cookie,但必须使用宏来提取WIFEXITED,WIFSIGNALED,WEXITSTATUS,WTERMSIG,等递增的cookie数字没有意义。如果知道W-macros在特定操作系统上的工作方式,则以数字方式将其打印出来会产生一些可以理解的想法,但是除了调试某些东西之外,您不应该这样做。父级在程序中打印的数字1537易于理解,以十六进制表示:0x0601。这意味着在增加原始Cookie值之前,其值为0x0600。在Linux上,WIFEXITED(0x0600)是和WEXITSTATUS(0x0600) == 6。在任何其他操作系统上,它可能意味着相同,也可能不相同。假设您打算生产一台Rube Goldberg机器,用于印刷6和7,则更好的方法是这样的:#include <assert.h>#include <stdio.h>#include <sys/types.h>#include <sys/wait.h>#include <unistd.h>int main(void){&nbsp; &nbsp;int val, status;&nbsp; &nbsp;pid_t pid = fork();&nbsp; &nbsp;if (pid == -1) {&nbsp; &nbsp; &nbsp; &nbsp;perror("fork");&nbsp; &nbsp; &nbsp; &nbsp;return 1;&nbsp; &nbsp;}&nbsp; &nbsp;if (pid == 0) {&nbsp; &nbsp; &nbsp; &nbsp;val = 5;&nbsp; &nbsp; &nbsp; &nbsp;val++;&nbsp; &nbsp; &nbsp; &nbsp;printf("%d\n", val);&nbsp; &nbsp; &nbsp; &nbsp;return val;&nbsp; &nbsp;}&nbsp; &nbsp;/* we are the parent if we get here */&nbsp; &nbsp;if (wait(&status) != pid) {&nbsp; &nbsp; &nbsp; &nbsp;perror("wait");&nbsp; &nbsp; &nbsp; &nbsp;return 1;&nbsp; &nbsp;}&nbsp; &nbsp;if (!WIFEXITED(status)) {&nbsp; &nbsp; &nbsp; &nbsp;assert(WIFSIGNALED(status));&nbsp; &nbsp; &nbsp; &nbsp;printf("child process killed by signal %d\n", WTERMSIG(status));&nbsp; &nbsp; &nbsp; &nbsp;return 1;&nbsp; &nbsp;}&nbsp; &nbsp;val = WEXITSTATUS(status);&nbsp; &nbsp;val++;&nbsp; &nbsp;printf("%d\n", val);&nbsp; &nbsp;return 0;}
打开App,查看更多内容
随时随地看视频慕课网APP