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

时间:2017-01-01 15:33:16

标签: linux process fork waitpid

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

}

由于

1 个答案:

答案 0 :(得分:1)

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

  

WIFEXITED(status)
  如果孩子正常终止,即通过致电exit(3)_exit(2),或从main()返回,则返回true。   WEXITSTATUS(status)
  返回子项的退出状态。这包括子项在exit(3)_exit(2)调用中指定的状态参数的最低8位或returnmain()语句的参数。仅当WIFEXITED返回true时才应使用此宏。

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

  

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

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

  

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

入睡不是状态变化。被SIGSTOP / SIGTSTP拦截是。