Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.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
LinuxC定时器-信号中断当前进程_C_Signals - Fatal编程技术网

LinuxC定时器-信号中断当前进程

LinuxC定时器-信号中断当前进程,c,signals,C,Signals,我正在开发一个具有特定时间限制的应用程序,这样一个事件应该(理想情况下准确地)每200秒发生一次。我正试着用定时器和信号来做这件事 #include <stdio.h> #include <time.h> #include <signal.h> #include <unistd.h> #include <pthread.h> timer_t timer_id; void start_timer(void) { struct

我正在开发一个具有特定时间限制的应用程序,这样一个事件应该(理想情况下准确地)每200秒发生一次。我正试着用定时器和信号来做这件事

#include <stdio.h>
#include <time.h>
#include <signal.h>
#include <unistd.h>
#include <pthread.h>

timer_t timer_id;

void start_timer(void)
{
    struct itimerspec value;

    value.it_value.tv_sec = 0;
    value.it_value.tv_nsec = 20000;

    value.it_interval.tv_sec = 0;
    value.it_interval.tv_nsec = 200000;

    timer_create(CLOCK_REALTIME, NULL, &timer_id);
    timer_settime(timer_id, 0, &value, NULL);
}

void handler(int sig) {
     printf("in handler\n");
}

void *my_thread(void *ignore)
{
    (void)ignore;

    start_timer();
    // Sleep forever
    while(1) sleep(1000);
}

int main()
{
    pthread_t thread_id;

    (void) signal(SIGALRM, handler);
    pthread_create(&thread_id, NULL, my_thread, NULL);
    // sleep is a placeholder for this SO question.  I want to do 
    // other processing here
    sleep(5000);
    printf("sleep finished\n");
}
#包括
#包括
#包括
#包括
#包括
计时器\u t计时器\u id;
无效启动计时器(无效)
{
结构itimerspec值;
value.it_value.tv_sec=0;
value.it\u value.tv\u nsec=20000;
value.it_interval.tv_sec=0;
value.it\u interval.tv\u nsec=200000;
计时器创建(时钟实时、空和计时器id);
计时器设置时间(计时器id,0和值,NULL);
}
无效处理程序(int sig){
printf(“在处理程序中\n”);
}
void*我的线程(void*忽略)
{
(无效)忽略;
启动计时器();
//长眠
而(1)睡眠(1000);
}
int main()
{
pthread_t thread_id;
(无效)信号(信号处理器);
pthread_create(&thread_id,NULL,my_thread,NULL);
//睡眠是这个问题的占位符。我想这样做
//其他处理在这里
睡眠(5000);
printf(“睡眠完成\n”);
}

在200us之后,调用信号处理程序。由于“sleep finished”(睡眠完成)消息提前显示,因此当sleep(5000)行运行时,它似乎被调用。我希望计时器中断启动计时器的线程,而不是主进程。这就是为什么我创建了一个线程来启动它。有没有办法让信号只中止线程上而不是主进程上的当前指令?我知道,当处理程序运行时,其他线程/进程将被阻塞,但我希望它们在之后继续运行,就好像什么都没有发生一样。例如,在本例中,我希望睡眠至少5000秒。

是的,您可以在启动任何其他线程之前在主线程中阻止信号(
pthread\u sigmask
),并且只在打算处理它的线程中取消阻止它。这将确保它到达您想要的线程中


但是,如果您已经有线程,您确定您确实需要一个计时器来生成信号吗
clock_nanosleep
应允许在精确的时间进行睡眠和唤醒,并避免所有信号的混乱。

首先打印哪一行?调用信号处理程序中非异步安全函数的未定义行为。@TonyTannous“在处理程序中”首先显示。@EOF:除非信号处理程序中断了一个非安全函数,否则它实际上不是UB,这不应该是这种情况(如果OP正确屏蔽信号也不会)@R..GitHubSTOPHELPINGICE如果任何非无锁原子或
易失性sig_原子\u t
对象上次在非信号处理程序上下文中写入时在信号处理程序上下文中读取,则这也是未定义的行为,反之亦然。你真的不能在信号处理程序中安全地使用非异步安全函数。谢谢,clock_nanosleep正是我想要的。我以前使用的是nanosleep,但一直遇到时钟漂移的问题。