【问题标题】:C receive signal from a specific processC 接收来自特定进程的信号
【发布时间】:2021-04-15 15:58:42
【问题描述】:

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

【问题讨论】:

    标签: c process signals ipc


    【解决方案1】:

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

    如果进程 A 知道进程 B 的 PID,它可以将其信号处理程序注册到 sigaction() and SA_SIGINFO。然后,在传递或接受信号时,进程 A 可以检查传递给处理程序的 the siginfo_t structuresi_codesi_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?
        ...
        }
    }
    

    【讨论】:

    • 我不明白为什么大多数流程或线程相关的答案在投票方面都没有得到很好的接受
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多