【发布时间】:2010-03-08 13:18:57
【问题描述】:
有什么方法可以区分程序中不同 fork() 函数创建的子进程。
global variable i;
SIGCHLD handler function()
{
i--;
}
handle()
{
fork() --> FORK2
}
main()
{
while(1)
{
if(i<5)
{
i++;
if( (fpid=fork())==0) --> FORK1
handle()
else (fpid>0)
.....
}
}
}
有什么方法可以区分由 FORK1 和 FORK2 创建的子进程吗?因为我试图在 SIGCHLD 处理函数中减少全局变量 'i' 的值,并且它应该只为由 FORK1 创建的进程减少 ..
我尝试使用数组并保存由 FORK1 创建的子进程的进程 ID,这是由父进程完成的。只有当死子的进程 id 在数组中时,我才会递减 'i' 的值...
但是我遇到了以下场景的问题
child1、parent1、child1 被杀、child2、child2 被杀、parent2
在 child1 的情况下,因为它在 parent1 之后被杀死,所以数组正确更新。
但是如果 child2 在它的 pid 值被数组中的 parent2 更新之前就被杀死了呢?在 SIGCHLD 信号处理函数内部,因为 child2 PID 值不在数组中,所以“i”值没有相应递减..
那么有没有更好的办法解决这个问题??
【问题讨论】:
-
嗯……其实我之前没找到……
-
你是如何设置信号处理程序的?与
signal、bsd_signal或sigaction?