为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

杨魅力 2021-04-11 12:13:08
我在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 6 1537
查看完整描述

1 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

在子级中,您的程序只需将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)

{

   int val, status;

   pid_t pid = fork();

   if (pid == -1) {

       perror("fork");

       return 1;

   }

   if (pid == 0) {

       val = 5;

       val++;

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

       return val;

   }

   /* we are the parent if we get here */

   if (wait(&status) != pid) {

       perror("wait");

       return 1;

   }

   if (!WIFEXITED(status)) {

       assert(WIFSIGNALED(status));

       printf("child process killed by signal %d\n", WTERMSIG(status));

       return 1;

   }

   val = WEXITSTATUS(status);

   val++;

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

   return 0;

}


查看完整回答
反对 回复 2021-04-16
  • 1 回答
  • 0 关注
  • 402 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信