gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:35:18 25 4
gpt4 key购买 nike

我需要创建一个接受两个参数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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com