gpt4 book ai didi

c - Linux C 计时器 - 信号中断当前进程

转载 作者:行者123 更新时间:2023-12-04 01:30:22 35 4
gpt4 key购买 nike

我正在开发一个具有特定时间限制的应用程序,这样一个事件应该(理想情况下)每 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 完成”消息提前显示。我希望计时器中断启动计时器的线程,而不是主进程。这就是为什么我创建了一个线程来启动它。有没有办法让信号只中止线程上的当前指令而不是主进程上的当前指令?我知道当处理程序运行时其他线程/进程将被阻塞,但我希望它们之后继续运行,就好像什么也没发生一样。例如,在这种情况下,我想至少睡 5000 秒。

最佳答案

是的,您可以在启动任何其他线程之前在主线程中阻塞信号 (pthread_sigmask),并且只在打算处理它的线程中解除阻塞。这将确保它到达您想要的线程。

但是,如果您已经有了线程,您确定您真的需要一个计时器为此生成信号吗? clock_nanosleep 应该允许在精确时间唤醒 sleep ,并避免所有糟糕的信号。

关于c - Linux C 计时器 - 信号中断当前进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61149363/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com