【问题标题】: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;
}

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

感谢您的帮助。

【问题讨论】:

    标签: c process signals fork alarm


    【解决方案1】:

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

    1. 子进程正常终止
    2. 孩子被信号终止了
    3. 孩子被信号拦住了
    4. 通过信号继续孩子

    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)超时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-15
      • 2021-11-07
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多