使用警报让父进程等待子进程几秒钟
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
)超时。
【讨论】:
以上是关于使用警报让父进程等待子进程几秒钟的主要内容,如果未能解决你的问题,请参考以下文章