如何从信号处理程序内部向其他进程发送通知?

时间:2016-10-19 06:36:56

标签: c signals ipc

我有2个进程让我们说A和B.进程A将从用户那里获得输入并进行一些处理。

流程A和B之间没有父/子关系。

如果进程A被信号杀死,有没有办法可以从内部信号处理程序向进程B发送消息?

注意:根据我的要求,如果处理完毕后处理已经收到用户的输入并且如果接收到SIGHUP信号则从主循环退出就可以了。

我心中有这样的想法。这个设计有什么缺陷吗?

进程A

    #include <stdio.h>
    #include <signal.h>

    int signal;// variable to set inside signal handler

    sig_hup_handler_callback()
    {
      signal = TRUE;
    }


    int main()
    {
      char str[10];
      signal(SIGHUP,sig_hup_handler_callback);
      //Loops which will get the input from the user.
       while(1)
      {
        if(signal == TRUE) { //received a signal
         send_message_to_B();
         return 0;
        }

        scanf("%s",str);
        do_process(str); //do some processing with the input
      }

      return 0;
    }

    /*function to send the notification to process B*/
    void send_message_to_B()
    {
         //send the message using msg que
    }

2 个答案:

答案 0 :(得分:1)

试想一下,如果进程A正在执行do_process(str);并且崩溃发生,那么在回调中Flag将会更新,但是你的while循环将永远不会被调用,所以你的send_message_to_B();将不会被调用。所以最好只将该函数放入回调函数中。

如下所示。

#include <stdio.h>
#include <signal.h>

int signal;// variable to set inside signal handler

sig_hup_handler_callback()
{
     send_message_to_B();
}


int main()
{
  char str[10];
  signal(SIGHUP,sig_hup_handler_callback);
  //Loops which will get the input from the user.
   while(1)
  {

    scanf("%s",str);
    do_process(str); //do some processing with the input
  }

  return 0;
}

/*function to send the notification to process B*/
void send_message_to_B()
{
     //send the message using msg que
}

答案 1 :(得分:1)

正如Jeegar在另一个答案中所提到的,致命信号将中断进程主执行并调用信号处理程序。控件不会回到被中断的地方。因此,现在显示的代码在处理致命信号后将永远不会调用send_message_to_B

请注意从信号处理程序调用的函数。从信号处理程序调用某些函数被认为是不安全的 - Refer section - Async-signal-safe functions