我正在尝试使用fork系统调用创建一个进程,然后等待子进程。我使用了以下内容:
waitpid(pid,& status,0);
1)第一个问题是状态向左移8位,例如,如果子进程返回1,则waitpid函数将状态变量中状态的值返回为256.请让我知道为什么它正在这样做。
2)根据手册,waitpid等待子进程改变状态。但后来它也说:
“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);
}
由于
答案 0 :(得分:1)
status
参数编码的不仅仅是孩子的退出代码。来自man waitpid
:
WIFEXITED(status)
如果孩子正常终止,即通过致电exit(3)
或_exit(2)
,或从main()
返回,则返回true。WEXITSTATUS(status)
返回子项的退出状态。这包括子项在exit(3)
或_exit(2)
调用中指定的状态参数的最低8位或return
中main()
语句的参数。仅当WIFEXITED
返回true时才应使用此宏。
main waitpid
解释了第三个参数的作用。
options的值是以下常量中零或更多的OR:
WNOHANG
如果没有孩子退出,请立即返回WUNTRACED
如果孩子已经停止(但没有通过ptrace(2)
追踪),也会返回。即使未指定此选项,也会提供已停止的已跟踪子女的状态WCONTINUED
(自Linux 2.6.10起)
如果通过交付SIGCONT
恢复已停止的孩子,也会返回。
国家变化的定义非常精确和狭隘。来自man waitpid
:
州的变化被认为是:孩子被终止;孩子被一个信号拦住了;或者孩子被信号恢复了。
入睡不是状态变化。被SIGSTOP
/ SIGTSTP
拦截是。