Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 用户定义的信号sigusr1和sigusr2_C_Linux_Signals_Ipc - Fatal编程技术网

C 用户定义的信号sigusr1和sigusr2

C 用户定义的信号sigusr1和sigusr2,c,linux,signals,ipc,C,Linux,Signals,Ipc,我正在构建一个简单的软件,其中有多个进程使用用户定义的信号SIGUSR1和SIGUSR2相互通信 我只是想知道在我下面描述的场景中会发生什么 “Process-1确实使用kill命令将sigusr1发送到Process-2,Process-2正在执行信号处理程序进行一些计算。即使在process-2完成信号处理程序的执行之前,process-1也会再次向process-2发送sigusr1。会发生什么。我无法得到这个问题的正确答案。我想有两种可能的情况 当前正在执行的处理程序是否被中断?或 第二

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

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

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

  • 当前正在执行的处理程序是否被中断?或
  • 第二个信号将被进程2忽略
    请告诉我

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


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

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


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

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

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

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

    这样,就不会忽略任何信号,您的程序也会更快,错误更少甚至没有

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

    下面是一个示例,其中使用信号将ascii消息发送到另一个进程:

    客户端发送部分

    服务器

    void signandler(内部符号)
    {
    静态int ascii=0;
    静态整数功率=0;
    if(signum==SIGUSR1)
    
    ascii+=1处理信号需要一些时间,如果一次发送太多信号,有些信号可能会被忽略

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

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

    这样,就不会忽略任何信号,您的程序也会更快,错误更少甚至没有

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

    下面是一个示例,其中使用信号将ascii消息发送到另一个进程:

    客户端发送部分

    服务器

    void signandler(内部符号)
    {
    静态int ascii=0;
    静态整数功率=0;
    if(signum==SIGUSR1)
    
    ascii+=1为什么不使用管道发送文本?这是学校的一个项目,我知道这不是最有效的方式,但使用信号是强制性的,其他任何方式都不允许。为什么不使用管道发送文本?这是学校的一个项目,我知道这不是最有效的方式,但使用信号是强制性的,其他任何方式都不允许允许。
    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);
    }