我需要创建一个接受两个参数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
联机帮助页记录了如何检查它们:
- 子进程正常终止
- child 被信号终止
- child 被信号拦住了
- 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/