我有一个服务器和客户端代码,IPC通过命名管道(FIFO)相互之间。客户端向服务器发送SIGNAL(例如SIGUSR1)并检查是否有任何信号以给定的时间分辨率到达(通过命令行参数)。服务器检查(如果它的5ms)每次5ms,检查是否有任何信号在5ms后到达,如果到达它会做一些代码,如果没有继续,直到它捕获信号。
所以这就是我的问题所在。我不知道如何使用这些动作。我查了一下“Unix系统编程:通信,并发和线程Kay A. Robbins,Steven Robbins”找到了一些可能对我有用的功能。睡眠,闹钟,uSleep,了nanosleep,暂停。但我不知道在我的情况下使用哪一个。睡眠是不可能的,我认为它需要几秒钟,我认为当你尝试转换为毫秒时它会溢出。
我可以很好地理解一些代码片段或psudocode。
我只是询问如何检查信号是否以给定的分辨率频率到达。我必须检查信号是否在这几毫秒内到达。如果信号被捕获,请检查任何给定的“n”毫秒。
答案 0 :(得分:0)
我认为nanosleep(以及usleep)功能可以起作用!
您必须为程序可以捕获的所需信号安装信号处理程序,例如:
#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);
/* .... */
}
你必须循环并等待信号。如果你发现了一个信号,你必须在处理程序内部执行操作,或者使用在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;
}
或者,您也可以处理处理程序内的信号。
替代解决方案
如果你确定信号会来,并且不需要每5毫秒控制一次,你也可以使用函数pause
。实际上,手册页说:
pause导致调用进程(或线程)进入睡眠状态直到发出信号 交付,要么终止过程,要么导致 调用信号捕捉功能。
在这种情况下,您只需安装信号处理程序并等待。
如果它回答了你的问题,请告诉我。
真诚的, 米尔科