繁体   English   中英

使用Linux系统调用等待的进程等待

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM