大家。我遇到的问题让我非常困惑。我只是试图打印出已终止进程收到的状态,但它没有像我想象的那样工作。这是代码。
int main(int argc, char *argv[])
{
printf("this process (%d)\n",(int)(getpid()));
int *status;
pid_t pid;
Signal(SIGINT, handler1);
if ((pid = fork())==0){
while(1)
;
}
kill(pid,SIGINT);
while(pid>0){
pid = waitpid(pid,status,0);
printf("status: %d\n", WEXITSTATUS(status));
printf("waitpid return: %d\n",(int)pid);
}
return 0;
}
void handler1(int sig){
printf("process (%d) has received a sigint\n",(int)(getpid()));
exit('d');
}
它有输出
this process (8811)
process (8812) has received a sigint
status: 0
waitpid return: 8812
status: 0
waitpid return: -1
当我使用WIFEXITED(status)时,它返回true。所以不应该WEXITSTATUS返回我通过退出而不是0的那个?
我这里没有包含信号功能。
答案 0 :(得分:0)
这是你的问题
int *status;
...
pid = waitpid(pid,status,0);
printf("status: %d\n", WEXITSTATUS(status));
您没有为状态分配空间。你只是声明一个指针(它可能初始化为0,或者当我们说指针时为NULL),然后将它传递给waitpid(如果它收到状态的NULL,则忽略它,这会阻止段错误) ),然后你将那个NULL指针传递给想要一个int的EXITSTATUS()宏(但无论如何它都将它视为零)。你得到“状态:0”。
您要做的是将您的状态声明为常规int,然后将其指针传递给waitpid():
int status;
...
pid = waitpid(pid,&status,0);
printf("status: %d\n", WEXITSTATUS(status));
这将打印出“状态:100”,就像您正在寻找的那样。