Linux C 计时器 - 信号中断当前进程
Linux C timer - signal disrupts current process
我正在开发一个具有特定时间限制的应用程序,这样一个事件应该(理想情况下)每 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");
}
200us 后调用信号处理程序。它似乎在 sleep(5000) 行为 运行 时被调用,因为 "sleep finished" 消息显示较早。我希望计时器中断启动计时器的线程,而不是主进程。这就是为什么我创建了一个线程来启动它。有没有办法让信号只中止线程上的当前指令而不是主进程上的当前指令?我知道另一个 threads/processes 将在处理程序运行时被阻止,但我希望它们之后继续,就好像什么也没发生一样。例如,在这种情况下,我想至少睡 5000 秒。
是的,您可以在启动任何其他线程之前在主线程中阻塞信号 (pthread_sigmask
),并且只在打算处理它的线程中解除阻塞。这将确保它到达您想要的线程。
但是,如果您已经有线程,您确定您确实需要一个计时器为此生成信号吗? clock_nanosleep
应该允许在精确的时间唤醒睡眠,并避免所有糟糕的信号。
我正在开发一个具有特定时间限制的应用程序,这样一个事件应该(理想情况下)每 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");
}
200us 后调用信号处理程序。它似乎在 sleep(5000) 行为 运行 时被调用,因为 "sleep finished" 消息显示较早。我希望计时器中断启动计时器的线程,而不是主进程。这就是为什么我创建了一个线程来启动它。有没有办法让信号只中止线程上的当前指令而不是主进程上的当前指令?我知道另一个 threads/processes 将在处理程序运行时被阻止,但我希望它们之后继续,就好像什么也没发生一样。例如,在这种情况下,我想至少睡 5000 秒。
是的,您可以在启动任何其他线程之前在主线程中阻塞信号 (pthread_sigmask
),并且只在打算处理它的线程中解除阻塞。这将确保它到达您想要的线程。
但是,如果您已经有线程,您确定您确实需要一个计时器为此生成信号吗? clock_nanosleep
应该允许在精确的时间唤醒睡眠,并避免所有糟糕的信号。