【问题标题】:how to use wait in C如何在 C 中使用等待
【发布时间】:2014-07-05 18:27:17
【问题描述】:

如何使用wait?它让我无所适从。我fork 一个带有递归的 proc 树,现在孩子们必须在我运行 pstree 时暂停(等待/睡眠),以便我可以打印 proc 树。

我应该使用

int status;
wait(&status);

或者说

wait(NULL)

我应该把这个放在哪里?在父级if(pid > 0) 或子级if(pid==0) 中?也许在 ifs 的末尾,所以我将所有 pids 存储在数组中,然后在它们上运行 for 并使用等待?

我的代码模板:

void ProcRec(int index)
{
     pid_t pid;
     int noChild = getNChild(index);

     int i= 0;
     for(i = 0; i < noChild; i++)
     { 
          pid = fork();

        if (pid > 0)
        {
            /* parent process */
        }
        else if (pid == 0)
        {
            /* child process. */
            createProc(index+1);
        }
        else
        {
            /* error */
            exit(EXIT_FAILURE);
        }
    }

    if(getpid() == root)
    {
        sleep(1); 
        pid = fork();
        if(pid == 0)
          execl("/usr/bin/pstree", "pstree", getppid(), 0);    
    }
}

【问题讨论】:

标签: c wait


【解决方案1】:

wait 系统调用使进程进入睡眠状态并等待子进程结束。然后它用子进程的退出代码填充参数(如果参数不是NULL)。

所以如果在父进程中你有

int status;
if (wait(&status) >= 0)
{
    if (WEXITED(status))
    {
        /* Child process exited normally, through `return` or `exit` */
        printf("Child process exited with %d status\n", WEXITSTATUS(status));
    }
}

在子进程中,您会执行例如exit(1),那么上面的代码就会打印出来

子进程以 1 个状态退出

另请注意,等待所有子进程很重要。当父进程仍在运行时,您不等待的子进程将处于所谓的僵尸状态,一旦父进程退出,子进程将成为孤立进程并成为进程 1 的子进程。

【讨论】:

  • @user2202368 那你就不用管状态了,等一个子进程退出就行了。
  • 如何等待多个孩子?
  • @CătălinaSîrbu wait 等待第一个孩子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
  • 2012-02-12
  • 2020-03-17
  • 2011-10-22
  • 2020-07-10
相关资源
最近更新 更多