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

标签 c process signals fork alarm

我需要创建一个接受两个参数WAIT 和TIME 的c 文件。

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

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

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

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

#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;
}

我没有太多,因为我正在努力思考如何让 parent 等待 child 给定的秒数。

感谢您的帮助。

最佳答案

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

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

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

关于c - 使用警报让父进程等待子进程几秒钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22993804/

相关文章:

Python signal.signal 是否阻止传播?

c - 负值与 rdi 寄存器的比较结果不正确

c - 我的 fork fifo c 代码不能正常工作

windows - 如何在多核系统上完全保留一个核?

c - pthread 条件信号与 POSIX 实时信号相同还是不同?

bash - 在同步执行期间如何处理 bash 中的信号?

c++ - 播放传入的视频流

c - 将服务添加到名称服务开关

c - 有没有一种方法可以在 C 中以周期性方式递减数组

linux - 如何杀死Linux中的特定进程?