如何正确实现alarm()方法来杀死fork()创建的所有工作进程?

时间:2010-02-08 02:31:28

标签: c unix

如果我有父协调程序和工作程序,但协调程序正在创建所有需要的工作进程。如果我想正确实现alarm()方法以杀死所有进程并在一段时间后终止程序。

这是实施它的正确方法吗?我拥有它的当前方式,它现在打印出消息对应的printf()消息,用于被杀死的工作进程。

注意:我实现了忽略中断信号,因此可以毫无顾虑地继续进行更多的工作进程。

int main(int argc, char** argv)
{
signal(SIGINT, sig_ctrl);
signal(SIGALRM, sig_alarm);

alarm(5); 
sleep(10);

    //rest of program which creates the needed processes

}

void sig_ctrl(int sig)
{
printf("Hold on buddy, you're not terminating this program with CTRL^C.\n");
}

void sig_alarm(int sig)
{
sleep(0);
fflush(stdout);
printf("The alarm is sounding, all worker procceses will be...TERMINATED!");
raise(SIGTERM);
 }

3 个答案:

答案 0 :(得分:2)

这是一种简单的方法,可以说是草率的方式,也是艰难的方式。

简单方法包括确保初始流程是流程组负责人,忽略适当的信号(但其子级不忽略信号),然后将信号发送到流程组。

更难的方法是在所有子进程的某个位置需要一个列表,然后父进程可以适当地向每个进程发送一个信号,从其列表中删除死的进程。

答案 1 :(得分:1)

你的程序的问题是sleep()通常是使用SIGALRM计时器实现的,所以调用它可能会覆盖SIGALRM的signal()设置

$ 3男人睡了

BUGS
       sleep()  may be implemented using SIGALRM; mixing calls to alarm(2) and
       sleep() is a bad idea.

(顺便说一下,sleep(0)也是胡说八道。你想用它做什么?)

答案 2 :(得分:0)

我在unix单元的一些作业中遇到了同样的问题。这几乎是大多数人想出的解决方案:P