【发布时间】:2015-05-03 13:47:19
【问题描述】:
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
void handler(int signumber)
{
return;
}
int main()
{
int i, pid;
int children_count = 5;
int arr_childprocesses[5];
int parent_pid = getpid();
for(i=0;i<children_count;i++)
{
pid = fork();
if(pid == -1)
{
perror("Err");
exit(EXIT_FAILURE);
}
if(pid == 0) break;
arr_childprocesses[i] = pid;
}
if (pid == 0) // children
{
kill(parent_pid,SIGUSR1);
printf("Child(%d) sig sent. Waiting 5s...\n",getpid());
sleep(5);
printf("Child(%d) terminated.\n",getpid());
}
else // parent
{
signal(SIGUSR1,handler);
for(i=0;i<children_count;++i)
{
waitpid(arr_childprocesses[i],NULL,0);
printf("Parent: Signal received.\n");
}
printf("Parent(%d) signals received. Waiting 3s...\n",getpid());
sleep(3);
printf("Parent(%d) terminated.\n",getpid());
}
exit(EXIT_SUCCESS);
}
我想等到所有孩子都给我发信号。然后与孩子和父母一起做一些工作。但是程序会停止,直到所有孩子都终止。我该怎么做?
结果:
更新 1:包含完整代码和结果
【问题讨论】:
-
waitpid()不等待来自孩子的信号,而是等待孩子的状态变化,即结束、停止或(重新)开始。然而,这些状态的变化伴随着一个信号。 -
啊,你是对的。我认为我应该使用不同的逻辑,比如在信号处理程序中增加一个全局 int 计数器。并使用类似这样的东西而不是 waitpid(): while(counter