【问题标题】:sigqueue() to send a signal to process groupsigqueue() 向进程组发送信号
【发布时间】:2017-01-20 02:51:51
【问题描述】:

我使用 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;
}       

【问题讨论】:

  • "sigqueue() 函数向一个进程或一组进程发送信号..." 你从哪里知道sigqueue() 可以用来发送一个向整个进程组发出信号? POSIX specificationLinux man page 都只表示可以向单个进程发出信号。
  • link,在这里。好的,我该怎么做?有可能的?许多帖子告诉我,kill() 和 sigqueue() 非常相似......

标签: c linux unix signals sigqueue


【解决方案1】:

如果您的实现确实支持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

但是,按照严格的标准,您并不走运。 sigqueuesupports neither the null signal (0) nor the ability to signal groups of processes:

标准开发人员要求sigqueue() 对空信号具有与kill() 相同的语义,并且使用相同的权限检查。但由于 kill() 的“广播”语义难以实现(例如,对进程组)以及与资源分配的交互,因此没有采用这种语义。 sigqueue() 函数将信号排队到由 pid 参数指定的单个进程。

【讨论】:

  • 我对@9​​87654326@的实现?它来自,所以没有机会......但是没有其他方法可以做到这一点吗?以某种方式从我创建的每个孩子身上提取 pid?
  • @Baal,“实施”是指您正在运行的平台/环境。至于其他方式来做你想做的事......我建议你在这个网站上问一个单独的问题。
猜你喜欢
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
  • 2017-07-11
  • 2013-07-30
  • 2017-09-06
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
相关资源
最近更新 更多