C linux中的等待(状态)系统调用
我在linux中做这个程序,我无法理解带有wait(&val)系统调用的程序的输出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;
#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,但你没有改变任何其他内容。你应该已经有足够的信息知道我是如何计算出来的。