【问题标题】:How to retrieve status of a child process without hanging father?如何在不挂父亲的情况下检索子进程的状态?
【发布时间】:2021-12-23 08:17:17
【问题描述】:

我想在做另一项工作时启动一个子进程,并能够检查子进程是否在父进程中完成。我发现waitpid 的 WNOHANG 选项有助于在能够跟踪它的同时不等待子完成。但是,status 变量在使用此选项时完全没有变化,就像我将其替换为 0 时一样。

你对这种行为有什么解释吗?我怎样才能做我想做的事(能够在父进程中知道孩子是否做了,而不用挂它)?

我有以下代码

#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include<sys/wait.h>
int main(){
    int status;
    printf("status=%d\n",status);
  pid_t p = fork();
  
 if(p==0){
     printf("je suis dans le fils\n");
     exit(0);
  }
  else if(p>0){
     printf("je suis dans le père\n");
     waitpid(p,&status,WNOHANG);
     sleep(5);
     printf("status= %d",status);
     exit(0);
  }
}

请多多包涵,我对 C 的了解并不深,还在学习中。

【问题讨论】:

  • 等待后需要再次拨打waitpid。您的 status 变量以后不会神奇地填充。
  • 您可以为SIGCHLD 信号创建一个处理程序。这将在孩子退出时运行,它可以调用wait()

标签: c process fork waitpid


【解决方案1】:

我想在做另一项工作时启动一个子进程,并能够检查子进程是否在父进程中完成。我发现 waitpid 的 WNOHANG 选项有助于在跟踪子进程的同时不等待子进程完成。但是,使用此选项时,状态变量根本不会改变,就像我将其替换为 0 时一样。

在子进程终止之前,该状态不可用。所以如果你在子进程终止之前用WNOHANG调用waitpid,你就无法得到状态。

我怎样才能做我想做的事(能够在父进程中知道孩子是否做了,而不是挂它)?

这就是您的代码所做的。它告诉你这个过程没有完成,所以你没有得到它的状态。

在子进程完成后使用WNOHANG 调用waitpid 或等待它完成以获取状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 2015-08-06
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    相关资源
    最近更新 更多