【问题标题】:Process wait using linux system call wait使用linux系统调用等待处理等待
【发布时间】:2017-01-01 15:33:15
【问题描述】:

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

}

谢谢

【问题讨论】:

    标签: linux process fork waitpid


    【解决方案1】:

    status 参数编码的不仅仅是孩子的退出代码。来自man waitpid

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

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

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

    状态变化的定义非常精确和狭隘。来自man waitpid

    状态改变被认为是:孩子终止;孩子被信号拦住;或者孩子被信号恢复了。

    进入睡眠状态不是状态变化。被SIGSTOP/SIGTSTP拦住是。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-28
      • 2015-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多