2017-01-01 79 views
0

我正在尝试使用fork系统调用创建进程,然后等待子进程。我已经使用了以下内容:使用Linux系统调用等待的进程等待

waitpid(pid,& status,0);

1)第一个问题是状态是8位向左移动,例如,如果子进程返回1,则waitpid函数返回状态变量中状态的值为256.请让我知道为什么它这样做。

2)根据手册,waitpid等待子进程改变状态。但随后又表示:

“等待()系统调用挂起调用进程的执行,直到 它的一个子终止呼叫等待(&状态)相当于 到:

waitpid函数( - 1,& status,0);“

我在这里有点困惑waitpid和等待调用是否等待状态更改或子进程终止。请清楚这一点。

第三个参数中的零是什么意思? 3)如果我把子进程置于睡眠状态,那么通过等待5秒等等,子进程的状态不会变成等待状态吗?

以下是我的程序:

int main(int argc, char ** argv) 
{ 
pid_t pid = fork(); 
pid_t ppp; 

if (pid==0) 
{ 
    sleep(8); 
    printf ("\n I am the first child and my id is %d \n", getpid()); 
    printf ("The first child process is now exiting now exiting\n\n"); 
    exit (1); 
} 

else { 
      int status = 13; 
      printf ("\nI am now waiting for the child process %d\n", pid); 
      waitpid (pid, &status, 0); 
      printf ("\n the status returned by the exiting child is %d\n", status>>8); 
     } 

printf("\nI am now exiting"); 
exit(0); 

}

感谢

回答

1

status参数编码的不仅仅是孩子的退出代码更多。从man waitpid

WIFEXITED(status)
返回true,如果孩子正常终止,也就是通过调用exit(3)_exit(2),或者从main()返回。
WEXITSTATUS(status)
返回孩子的退出状态。这包括子进程在exit(3)_exit(2)的调用中指定的状态参数的最低有效8位或作为main()中的return语句的参数。仅当WIFEXITED返回true时才应使用此宏。

main waitpid解释了第三个参数的作用。

选项的值是以下常量零以上的OR:如果
WNOHANG
立即返回没有孩子已经退出。
WUNTRACED
如果孩子已停止(但未通过ptrace(2)跟踪),也会返回。即使未指定此选项,也会提供已停止的跟踪孩子的状态。
WCONTINUED(因为Linux 2.6.10)
也返回,如果停止的孩子已经通过交付的SIGCONT恢复。

状态的变化是非常精确和狭义的。从man waitpid

状态变化被认为是:孩子终止;孩子被一个信号阻止了;或者这个孩子被一个信号恢复了。

睡觉不是一个国家的变化。通过SIGSTOP/SIGTSTP停止的。