如何从父进程获取子进程的状态,即它是停止、继续还是退出?对于 Linux,C 语言

Posted

技术标签:

【中文标题】如何从父进程获取子进程的状态,即它是停止、继续还是退出?对于 Linux,C 语言【英文标题】:How do I get the status of a child process from a parent, i.e. has it stopped, continued, or exited? For Linux, C lang 【发布时间】:2021-07-07 04:16:53 【问题描述】:

这是 Linux (ubuntu) 中的 C 语言程序。我一直在试图弄清楚如何从父进程那里获取子进程的状态。

我编写了一个简单的子进程,它在 25 秒内计数到 25,并将滴答计数输出到标准输出。在父进程中,我 1> 停止子进程 几秒钟。 2> 继续 几秒钟,然后 3> 杀死子进程。 我想获取我一直在使用的子进程的状态waitpid() 函数。但是,我发现如果我使用标志:

waitCondition = WUNTRACED | W继续

它确实返回“已停止”状态,但在处于继续状态时会挂起。

相反,如果我将标志设置为:

waitCondition=WUNTRACED | W续 |挂机

停止状态没有注册,但是继续状态是通过waitpid()注册的。

我正试图让父级在停止、继续或退出时识别状态。

我有下面的代码。有没有人对此有任何想法?谢谢!

int waiting4pid()(pid_t processID)
   
    int waitCondition = WUNTRACED | WCONTINUED;
    int currentState;

    while (waitpid(processID,&currentState,waitCondition) > 0)

        if(WIFCONTINUED(currentState))
            printf("\n currentState = continued!\n");
        
        if(WIFSIGNALED(currentState))
            printf("\n currentState = signaled!\n");            
        
        if(WIFSTOPPED(currentState))
            printf("\n currentState = stopped!\n");
        
        
    


void sigTest()
 
    pid_t processID;

    processID = fork();
    if(processID ==0)  // child
       // tmp/loop is an application that counts to 25 in 25 seconds and then exits.
       execlp("tmp/loop", "tmp/loop", NULL);
    else 
        sleep(2);
        printf("\n Stop!");
        kill(processID, SIGSTOP);
        waiting4pid()(processID);
        
        sleep(2);
        printf("\n Continue!");      
        kill(processID,SIGCONT);
        waiting4pid()(processID);
        
        sleep(2);
        printf("\n Kill!"); 
        kill(processID, SIGKILL);
        waiting4pid()(processID);
    


void main() 
    
    sigTest();

【问题讨论】:

您希望waitpidstatus 函数如何退出while 循环?您向孩子发送信号,然后致电waitpidstatus。然后waitpidstatus 将获取状态更改并返回等待下一个状态更改。但是不会有下一个状态变化,因为父级现在在waitpidstatus 上被阻止,因此它无法发送下一个信号。 @kaylum 谢谢!我对 waitpid() 的工作原理有一个误解。 【参考方案1】:

为了检查进程是否退出,请执行以下操作:

if(WIFEXITED(status) 

    // do your stuff

    // you can also check the exit status
    if(WEXITSTATUS(status) != EXIT_SUCCESS) 
        // the child process exited with error
    

正如@kaylum 在问题下的评论中已经提到的那样,waitpid() 调用会阻塞,直到孩子改变状态。但是您可以通过调用waitpid() 并设置WNOHANG 标志来修改此行为(如果您需要监视子进程但同时在父进程中执行一些其他操作,这将很有用;或者您可以waitpid() in一个单独的线程)。

【讨论】:

以上是关于如何从父进程获取子进程的状态,即它是停止、继续还是退出?对于 Linux,C 语言的主要内容,如果未能解决你的问题,请参考以下文章

fork 和 signal:如何将信号从父进程发送到特定的子进程

如何使用从父级继承的句柄创建提升的子进程

pythony中子进程如果一定时间不结束就停止应该如何做?

从父进程和子进程关闭管道

在nodejs中管道从子节点到父节点的数据

进程控制---子进程终止状态相关的宏