使用警报让父进程等待子进程几秒钟

Posted

技术标签:

【中文标题】使用警报让父进程等待子进程几秒钟【英文标题】:using alarm to get parent process to wait on child process for a number of seconds 【发布时间】:2014-04-10 16:32:01 【问题描述】:

我需要创建一个包含两个参数WAIT, and TIME 的c 文件。

代码应该首先 fork() 一个工作 W 秒然后退出的子进程。父进程应该等待子进程,但最多等待 T 秒。

等待 T 秒后,父进程应该停止等待并打印消息“T 秒后超时。”,然后退出。

另一方面,如果子进程在超时之前终止,父进程应该打印消息“子进程完成”。然后退出。

我想尝试使用alarm() 函数来执行此操作,但我不知道具体如何。

#include <stdio.h>


int int main(int argc, char const *argv[])

    int W = atoi(argv[1]); 
    int T = atoi(argv[2]);
    pid_t pid = fork(); 
    if (pid ==0)
        sleep(W); 

    
    else
        alarm(T); 
            //REST OF CODE HERE

    

    return 0;

我没有太多,因为我正在努力思考如何让父母在给定的秒数内等待孩子。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

我认为您正在寻找的是SIGCHLD ...这是当孩子改变状态时发送给父母的信号。有一个专门设计用于等待这个信号的系统调用,适当地称为wait。有 4 种状态变化可以触发信号,wait 手册页记录了如何检查它们:

    子进程正常终止 孩子被信号终止了 孩子被信号拦住了 通过信号继续孩子

wait 将阻止父级,直到它收到一个信号——SIGCHLD 或另一个未被忽略的信号。这意味着您使用alarm 的策略应该可以完美运行(但是,您应该注意SIGALRM 的默认操作是终止程序,所以如果这不是您想要的,您需要更改它):

#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(int argc, char *argv[])

    int W;
    int T;
    int status;
    pid_t pid;
    if(argc != 3) return 1;
    W = atoi(argv[1]);
    T = atoi(argv[2]);
    pid = fork();
    if(pid == 0)
    
        sleep(W);
    
    else
    
        alarm(T);
        if(wait() == -1)
        
            /*
            This will not actually run unless you override
            the default action for SIGALRM
            */
        
        else
        
             /*Child changed state*/
             /*Check how with WIF... macros*/
        
    
    return 0;

您还有一个可能需要更多工作的选项,但您可能想探索一下。还有另一个名为sigtimedwait 的系统调用可以等待一组信号(包括SIGCHLD)超时。

【讨论】:

以上是关于使用警报让父进程等待子进程几秒钟的主要内容,如果未能解决你的问题,请参考以下文章

进程等待与程序替换

在父进程恢复执行之前等待所有子进程 UNIX

如何使用clone()让父进程和子进程同时运行?

如何让父进程和子进程相互监听?

supervisor启动一个子进程后等待几秒再启动其他子进程

将字符串发送到子进程的信号