2017-04-15 26 views
0

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

所以这就是我的问题所在。我不知道用什么来做这种动作。我查阅了“Unix系统编程:通信,并发和线程Kay A. Robbins,Steven Robbins”发现了可能用于我的一些函数。睡眠,闹钟,uSleep,了nanosleep,暂停。但我不知道在我的情况下使用哪一个。睡眠是没有问题的,我认为由于它需要几秒钟,我认为它会在您尝试转换为毫秒时溢出。

一段代码片段或psudocode会很好理解我。

我只是问如何检查信号是否以给定的分辨率频率到达。我必须检查信号是否以毫秒为单位。如果信号捕捉,请检查任何给定的“n”mseconds。

+0

这是不清楚 - 想必你已经注册的信号处理,但除此之外,我不能告诉你描述。 –

+0

我做了一个信号处理程序。我有2个程序,一个叫做Timeserver,另一个是客户端。 Timeserver以毫秒为单位获取点击以检查信号是否到达给定的参数。像“./timeserver 5”会每5毫秒检查一次信号。如果有信号,信号处理程序当然会运行。我基本上想阻止和解除给定的“毫秒参数” – opricnik

+0

你不想阻止和解锁。如果信号到达,您希望信号处理程序设置一个标志。 – AlexP

回答

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. 你必须等待一个信号。如果发现信号,则必须在处理程序内执行操作,或者使用纳秒睡眠中断时引发的异常。

    #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; 
        } 
    

另外,您还可以处理的处理程序内部的信号。

替代解决方案 如果您确信的信号都不会来了,并不需要控制每5毫秒,你也可以使用函数pause。事实上该男子页说:

暂停导致调用进程(或线程)睡眠状态,直到信号 被传递,要么终止进程或导致 调用一个信号捕获功能。

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

让我知道它是否回答你的问题。

诚恳你的, 米尔科

+0

谢谢while循环解决方案为我工作。即使我知道它会%100给我信号我必须使用愚蠢的方式,因为他们想如何设计。 – opricnik