用户定义的信号 sigusr1 和 sigusr2

Posted

技术标签:

【中文标题】用户定义的信号 sigusr1 和 sigusr2【英文标题】:user defined signals sigusr1 and sigusr2 【发布时间】:2016-09-20 09:32:29 【问题描述】:

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

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

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

    当前正在执行的处理程序被中断了?或 进程 2 将忽略第二个信号。

请给我建议。

【问题讨论】:

【参考方案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);

【讨论】:

【参考方案2】:

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

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

【讨论】:

为什么不使用管道发送文本? 这是 School 的一个项目,我知道这不是最有效的方法,但使用信号是强制性的,不允许其他任何事情。

以上是关于用户定义的信号 sigusr1 和 sigusr2的主要内容,如果未能解决你的问题,请参考以下文章

转-Unix系统进程对SIGTERMSIGUSR1和SIGUSR2信号处理

C等待信号循环

Linux 信号详解

linux 的信号种类

python 信号通信

7. 信号的处理问题