waitpid(pid,status,0)状态无法正确读取

时间:2015-12-08 02:58:28

标签: process signals exit sigint waitpid

大家。我遇到的问题让我非常困惑。我只是试图打印出已终止进程收到的状态,但它没有像我想象的那样工作。这是代码。

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的那个?

我这里没有包含信号功能。

1 个答案:

答案 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”,就像您正在寻找的那样。