首页 文章

进程等待使用linux系统调用等待

提问于
浏览
0

我正在尝试使用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);

}

谢谢

1 回答

  • 1

    status 参数编码的不仅仅是子代码的退出代码 . 从 man waitpid

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

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

    options的值是以下常量中零或更多的OR:如果没有孩子退出,WNOHANG会立即返回 . 如果孩子已经停止(但没有通过ptrace(2)追踪),WUNTRACED也会返回 . 即使未指定此选项,也会提供已停止的已跟踪子项的状态 . WCONTINUED(自Linux 2.6.10起)也会在已通过交付SIGCONT恢复已停止的子项时返回 .

    国家变化的定义非常精确和狭隘 . 从 man waitpid

    州改变被认为是:孩子被终止;孩子被一个信号拦住了;或者孩子被信号恢复了 .

    睡觉不是状态的改变 . 被 SIGSTOP / SIGTSTP 拦住了 .

相关问题