C接收来自特定进程的信号

C接收来自特定进程的信号,c,process,signals,ipc,C,Process,Signals,Ipc,我正试图解决一个C项目中的问题,其中两个进程a和B通信。 进程B使用bash接收来自用户的信号,并将该信号发送给进程a。 进程A必须忽略来自用户的任何信号,但必须只接收来自进程B的信号。 问题是: 是否可以仅使用信号写入此通信,或者我必须使用另一种数据结构(如套接字)才能实现此通信?否,这在使用信号时是不可能的。信号必须具有“发送者”的概念,因此应用程序无法检查是谁生成了信号 但是,您可以使用管道在两个进程之间传递数据。是的,标准UNIX信号可以实现这一点,标准UNIX信号具有发送者的概念,因此

我正试图解决一个C项目中的问题,其中两个进程a和B通信。 进程B使用bash接收来自用户的信号,并将该信号发送给进程a。 进程A必须忽略来自用户的任何信号,但必须只接收来自进程B的信号。 问题是:
是否可以仅使用信号写入此通信,或者我必须使用另一种数据结构(如套接字)才能实现此通信?

否,这在使用信号时是不可能的。信号必须具有“发送者”的概念,因此应用程序无法检查是谁生成了信号


但是,您可以使用管道在两个进程之间传递数据。

是的,标准UNIX信号可以实现这一点,标准UNIX信号具有发送者的概念,因此您的应用程序可以检查是谁生成了信号

如果进程A知道进程B的PID,它可以将其信号处理程序注册到。然后,在信号交付或接收后,进程A可以检查传递给处理程序的
si_代码
si_pid
成员。如果不是来自B,就不要采取行动

比如:

static pid_t pid_of_B;

....

static void
my_handler(int sig_num, siginfo_t *si, void *ignored) {
    switch (si->si_code) {
    case SI_USER:   // sent via kill
    case SI_QUEUE:  // sent via sigqueue
        if (si->si_pid == pid_of_B) ...   // sent from B?
    ...
    }
}

我不明白为什么大多数与流程或线程相关的答案在投票方面没有得到很好的接受