检查信号是否达到给定分辨率

时间:2017-04-15 18:14:02

标签: c unix

我有一个服务器和客户端代码,IPC通过命名管道(FIFO)相互之间。客户端向服务器发送SIGNAL(例如SIGUSR1)并检查是否有任何信号以给定的时间分辨率到达(通过命令行参数)。服务器检查(如果它的5ms)每次5ms,检查是否有任何信号在5ms后到达,如果到达它会做一些代码,如果没有继续,直到它捕获信号。

所以这就是我的问题所在。我不知道如何使用这些动作。我查了一下“Unix系统编程:通信,并发和线程Kay A. Robbins,Steven Robbins”找到了一些可能对我有用的功能。睡眠,闹钟,uSleep,了nanosleep,暂停。但我不知道在我的情况下使用哪一个。睡眠是不可能的,我认为它需要几秒钟,我认为当你尝试转换为毫秒时它会溢出。

我可以很好地理解一些代码片段或psudocode。

我只是询问如何检查信号是否以给定的分辨率频率到达。我必须检查信号是否在这几毫秒内到达。如果信号被捕获,请检查任何给定的“n”毫秒。

1 个答案:

答案 0 :(得分:0)

我认为nanosleep(以及usleep)功能可以起作用!

  1. 您必须为程序可以捕获的所需信号安装信号处理程序,例如:

    #include <signal.h>
    /* Handler for the signals */
    void my_handler(int signum)
    {
        if(signum == SIGUSR1) {
        /* Perform an action on signal SIGUSR1*/
        }
    }
    int main(int argc, char * argv[]){
        /* .... */
        /* Install the signal handler to catch the desired signals*/
        signal(SIGUSR1, my_handler);
        /* .... */
    }
    
  2. 你必须循环并等待信号。如果你发现了一个信号,你必须在处理程序内部执行操作,或者使用在nanosleep中断时引发的异常。

     #include <time.h> /* Contains nanosleep + timespec definition */
     #include <errno.h> /* Contains the errno variable and the ERROR_CODE macros */
     #include <stdio.h> /* Contains definition of perror */
     #include <stdlib.h> /* Contains the exit function */
    
     int main(int argc, char * argv[]){
       /* fetch milliseconds from argv and put in a variable named "ms" */
       struct timespec interval;
       interval.tv_sec = 0; /* Seconds*/ 
       interval.tv_nsec = ms*1e6; /* 10^6 Nanoseconds = 1 millisecond */
       struct timespec interrupted;
       /* .. */
       while(1) {
           if(nanosleep(&interval, &interrupted) != 0){
               /* The sleeping was interrupted! */
               if(errno == EINTR){
                    //The interruption is due to a signal
               }
               else {
                    /*The interruption is due to another cause (read the man page) --> Print an error message */
                    perror("Nanosleep"); 
                    break; /* Exit from main loop */
               }
        } 
        return EXIT_FAILURE;
      }
    
  3. 或者,您也可以处理处理程序内的信号。

    替代解决方案 如果你确定信号会来,并且不需要每5毫秒控制一次,你也可以使用函数pause。实际上,手册页说:

      

    pause导致调用进程(或线程)进入睡眠状态直到发出信号          交付,要么终止过程,要么导致          调用信号捕捉功能。

    在这种情况下,您只需安装信号处理程序并等待。

    如果它回答了你的问题,请告诉我。

    真诚的, 米尔科