1 回答

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超5個(gè)贊
在子級(jí)中,您的程序只需將1加5,產(chǎn)生6,打印6,然后返回6作為退出狀態(tài)。
在父級(jí)中,wait(&val)成功返回后,將val包含一個(gè)魔術(shù)cookie。孩子的退出狀態(tài)被編碼在這個(gè)cookie,但必須使用宏來提取WIFEXITED,WIFSIGNALED,WEXITSTATUS,WTERMSIG,等遞增的cookie數(shù)字沒有意義。如果知道W-macros在特定操作系統(tǒng)上的工作方式,則以數(shù)字方式將其打印出來會(huì)產(chǎn)生一些可以理解的想法,但是除了調(diào)試某些東西之外,您不應(yīng)該這樣做。
父級(jí)在程序中打印的數(shù)字1537易于理解,以十六進(jìn)制表示:0x0601。這意味著在增加原始Cookie值之前,其值為0x0600。在Linux上,WIFEXITED(0x0600)是和WEXITSTATUS(0x0600) == 6。在任何其他操作系統(tǒng)上,它可能意味著相同,也可能不相同。
假設(shè)您打算生產(chǎn)一臺(tái)Rube Goldberg機(jī)器,用于印刷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;
}
添加回答
舉報(bào)