我使用fork()(大约3个孩子)创建进程树。我可以通过kill(-getpgrp(),signal_number)轻松地向所有人发送信号,但是如何对sigqueue执行相同操作?
sigqueue()函数向进程或一组进程发送信号,他们说,但与kill()不同,我不能使用sigqueue()通过指定向整个进程组发送信号pid中的负值。
那怎么办呢?
编辑:
代码:
s1.c是一个程序,我可以抓住"控制它们的信号。 因此,s1(具有相同的组ID)的两个等待来自sigqueue()的信号。
int main (int argc,char *argv[])
{
int i=0;
char *do=argv[1];
int b=atoi(argv[2]);
int y=fork();
if(argc !=3)
{
printf("wrong arg number\n");
exit(0);
}
do{
switch(fork())
{
case -1:
perror("error \n");
exit(1);
break;
case 0:
execl("s1","s1.c",argv[1],argv[2], NULL);
break;
default:
sleep(2);
break;
}
i++;
}
while(i<3);
sleep(2);
printf("ssignal %d send to gpid : %d\n",b,getpgrp());
union sigval value;
value.sival_int = 0;
value.sival_ptr = 0;
if(sigqueue(getpgrp(), b, value) == 0) {
printf("signal sent successfully!!\n");
} else {
perror("SIGSENT-ERROR:");
}
return 0;
while(wait(0) != -1){}
return 0;
}
答案 0 :(得分:0)
如果您的实施确实支持sigqueue
中的流程组信令,那么您可能需要完全what you would do for the pid argument to kill:
sigqueue(-getprgp(), signo, value); // Nonstandard. Remember to _negate_ the PGID
sigqueue(0, signo, value); // Nonstandard. Shorthand to signal my own PGID
然而,按照严格的标准,你运气不好。 sigqueue
supports neither the null signal (0) nor the ability to signal groups of processes:
标准开发人员要求 sigqueue()与 kill()相关的空信号具有相同的语义,并且使用相同的权限检查。但由于难以实现 kill()(例如,处理组)的“广播”语义以及与资源分配的交互,因此未采用此语义。 sigqueue()函数将信号排队到pid参数指定的单个进程。