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

标签 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
    }

最佳答案

试想一下,如果进程 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
}

关于c - 如何从信号处理程序内部向其他进程发送通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40123908/

相关文章:

c++ - 每次我在 linux c++ 中运行命名管道程序时都会发出 SIGSTOP 信号

matlab - 两个信号之间的相似性 : looking for simple measure

memory-management - linux中vmsplice()系统调用是否有逆向操作?

javascript - 在 node.js 中为所需模块创建回调

linux - 启动进程并在稍后阶段终止

c - 识别具有区域设置相关行为的 C 库函数的使用

c++ - 在堆栈上工作 "function calls"?

c# - 将字符串从 C++ 编码到 C# 时出现异常

c - 使用register_chrdev动态分配主编号时,保留256个次编号有什么意义吗?

c - 这个信号示例有什么问题?