用户定义信号sigusr1和sigusr2

时间:2016-09-20 09:32:29

标签: c linux signals ipc

我正在构建一个简单的软件,其中有多个进程使用用户定义的信号SIGUSR1和SIGUSR2相互通信。

我很想知道在下面描述的场景中会发生什么。

“Process-1确实使用kill命令将sigusr1发送到进程-2,进程-2正在执行信号处理程序进行一些计算。甚至在进程-2完成信号处理程序进程-1的执行之前,再次发送sigusr1到sigusr1过程-2。会发生什么。我无法得到正确答案。我想到了两种可能的情况。

  1. 正在执行的处理程序当前是否被中断?或
  2. 第二个信号将被进程-2忽略。
  3. 请指教。

2 个答案:

答案 0 :(得分:1)

我建立了一个像你一个月前的程序,目标是使用信号将文本从一个进程发送到另一个进程。根据我的经验,如果您不等待进程-2完成其计算,则进程-1发送的信号将被第二个进程忽略,您的消息/数据将丢失。

为了不发生这种情况,我建议你从进程-2发回一个信号,告诉进程-1计算结束,它可以发送另一条消息。

答案 1 :(得分:1)

处理信号需要一些时间,如果你一次发送太多,有些可能会被忽略。

你可以做的是向另一个进程发送一个响应信号,基本上说:

  嘿,我收到了你的信号,发给我下一个我准备好的信息

这样一来,没有信号会被忽略,你的程序会变得更快,而且没有错误。

如果您想要一个便宜的解决方案,只需使用usleep()和一个小值(实际取决于您的硬件)

以下是使用信号将ascii消息发送到另一个进程的示例:

  

客户 - 发送部分

void        decimal_conversion(char ascii, int power, int pid)
{
  if (power > 0)
    decimal_conversion(ascii / 2, power - 1, pid);
  if ((ascii % 2) == 1)
    kill(pid, SIGUSR1);
  else
    kill(pid, SIGUSR2);
  usleep(1);
}

void        ascii_to_binary(char *str, int pid)
{
  int       i;

  i = 0;
  while (str[i] != '\0')
    {
      decimal_conversion(str[i], 7, pid);
      i += 1;
    }
}
  

服务器

void        sighandler(int signum)
{
  static int    ascii = 0;
  static int    power = 0;

  if (signum == SIGUSR1)
    ascii += 1 << (7 - power);
  if ((power += 1) == 8)
    {
      putchar(ascii);
      power = 0;
      ascii = 0;
    }
}

int     main(void)
{
  signal(SIGUSR1, sighandler);
  signal(SIGUSR2, sighandler);
  while (42);
  return (0);
}