Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C linux中的等待(状态)系统调用_C_Linux - Fatal编程技术网

C linux中的等待(状态)系统调用

C linux中的等待(状态)系统调用,c,linux,C,Linux,我在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;

我在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;
}

在子级中,程序只需将1添加到5,生成6,打印6,然后返回6作为退出状态

在父级中,
wait(&val)
成功返回后,
val
包含一个。子项的退出状态编码在此cookie中,但必须使用宏
WIFEXITED
WIFSIGNALED
WEXITSTATUS
WTERMSIG
等来提取。以数字方式递增cookie没有意义。如果您知道W宏在特定操作系统上的工作方式,以数字形式打印出来会产生一些您可以在心里理解的东西,但是您不应该这样做,除非是为了调试某些东西

父级在程序中打印的数字1537更容易理解为十六进制:0x0601。这意味着在递增之前,原始cookie值是0x0600。在Linux上,
WIFEXITED(0x0600)
为true,
WEXITSTATUS(0x0600)==6
。在任何其他操作系统上,它可能意味着相同的事情,也可能不意味着相同的事情

假设您的意图是生成一个用于打印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;
}
#包括
#包括
#包括
#包括
#包括
内部主(空)
{
int val,状态;
pid_t pid=fork();
如果(pid==-1){
佩罗尔(“福克”);
返回1;
}
如果(pid==0){
val=5;
val++;
printf(“%d\n”,val);
返回val;
}
/*如果我们到了这里,我们就是父母*/
如果(等待(&status)!=pid){
佩罗(“等待”);
返回1;
}
如果(!妻子退出(状态)){
断言(WIFSIGNALED(status));
printf(“子进程被信号%d\n杀死”,WTERMSIG(状态));
返回1;
}
val=WEXITSTATUS(状态);
val++;
printf(“%d\n”,val);
返回0;
}

在此处插入代码(而不是图像)。截图、上传到主机并在此处放置链接是否真的比复制并粘贴为文本更容易?现在确实是阅读的时候了,尤其是命名为和的部分。还有。最后学习如何创建一个.Spoiler:What's
((5+1)我已经阅读了几个关于wait()系统调用的主题,但我不理解的是“1537”作为输出。返回语句在这个代码段中的作用是什么?您的回答很有帮助。但是您能简要解释一下为什么程序在所问问题中显示1537作为输出吗above@HuzaifaJalil我刚才加了一句话。@HuzaifaJalil请重读这个答案,我之前关于1537年所说的是错误的。12是什么81meaning@HuzaifaJalil这意味着你改变了你的程序,使孩子返回5而不是6,但你没有改变任何其他内容。你应该已经有足够的信息知道我是如何计算出来的。