[英]Process wait using linux system call wait
我正在尝试使用fork系统调用创建一个进程,然后等待子进程。 我使用了以下内容:
waitpid(pid,&status,0);
1)第一个问题是状态向左移动了8位,例如,如果子进程返回1,waitpid函数将状态变量中的状态值返回为256。请让我知道为什么这样做那。
2)根据手册,waitpid等待子进程改变状态。 但随后它又说:
“ wait()系统调用将暂停调用过程的执行,直到其子级之一终止。调用wait(&status)等效于:
waitpid(-1,&status,0);“
我在这里有点困惑,是waitpid和wait调用是等待状态更改还是等待子进程终止。 请澄清这一点。
第三次争论中的零表示什么?
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);
}
谢谢
status
参数不仅对子级的退出代码进行编码。 从man waitpid
:
WIFEXITED(status)
如果子项正常终止(即通过调用exit(3)
或_exit(2)
或从main()
返回_exit(2)
,则返回true。
WEXITSTATUS(status)
返回子项的退出状态。 它由状态参数的最低有效8位组成,该状态参数的子级在对exit(3)
或_exit(2)
的调用中指定,或者作为main()
return
语句的参数。 仅当WIFEXITED
返回true时才应使用此宏。
main waitpid
解释了第三个参数的作用。
options的值是以下常量的零或更多的或:
WNOHANG
如果没有孩子退出,请立即返回。
WUNTRACED
如果孩子已经停止(但未通过ptrace(2)
跟踪ptrace(2)
也返回。 即使未指定此选项,也会提供已停止的跟踪子项的状态。
WCONTINUED
(自Linux 2.6.10起)
如果已通过交付SIGCONT
恢复了被阻止的孩子,则还返回。
状态变化是非常精确和狭窄的定义。 从man waitpid
:
状态更改被认为是:子项终止; 这个孩子被一个信号挡住了; 或该孩子被信号恢复。
入睡不是状态变化。 正在被SIGSTOP
/ SIGTSTP
停止。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.