- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 setitimer 发送 SIGALRM,它又调用我的处理函数来打印到标准输出。我已经在互联网上搜索了几个小时,但根本没有明确指示应如何使用 setitimer。我尝试过各种组合,但似乎都不起作用。在我的代码中,我使用套接字和pthreads,但我不认为它与问题真正相关,因为我试图通过信号设置警报,这无论如何都会停止所有线程,所以我将保留该代码简单。
void handle_alarm(int sig){
printf("Printing Info\n");
}
int main(int argc, char**argv){
struct itimerval it_val;
signal(SIGALRM, handle_alarm);
it_val.it_value.tv_sec = 1;
it_val.it_value.tv_usec = 1000000;
it_val.it_interval = it_val.it_value;
setitimer(ITIMER_REAL, &it_val, NULL);
while(1){}
return 0;
}
它应该只是每秒打印到终端,但事实并非如此。谁能给我一些建议吗?
最佳答案
Can anyone give me any advice?
内核可能!如果系统调用失败,内核会报告一个错误代码。 libc 将报告发生的错误并相应地设置 errno 。从而改变
setitimer(ITIMER_REAL, &it_val, NULL);
至
if (setitimer(ITIMER_REAL, &it_val, NULL) == -1) {
perror("setitimer");
exit(1);
}
看看出了什么问题。 appropriate man page将包含可能的错误代码及其原因的列表:
EFAULT new_value, old_value, or curr_value is not valid a pointer.
EINVAL which is not one of ITIMER_REAL, ITIMER_VIRTUAL, or
ITIMER_PROF; or (since Linux 2.6.22) one of the tv_usec fields
in the structure pointed to by new_value contains a value
outside the range 0 to 999999.
该修复留给提问者作为练习。另外,不要习惯从信号处理程序内部调用非异步信号安全函数!
关于c - 如何在 C 中将 setitimer 与 SIGALRM 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53606077/
我有以下情况 void foo() { printf("hi\n"); while(1); } int main(void) { struct sigaction temp; t
每个task_struct在 linux 内核中有一个名为“real timer”的字段,它是一个 struct hrtimer (高分辨率定时器)。当我们使用 setitimer 设置定时器时,它将
我有以下代码,我希望它会等待 2 秒,然后循环等待 5 秒。 我没有使用 it_interval 重新启动计时器是有原因的。 #include #include #include #includ
我需要一个高分辨率计时器(至少具有微秒级别的分辨率)并且我发现 setitimer() 可以设置为微秒级别。 struct itimerval t; t.it_interval.tv_sec = 0;
我需要在同一进程中设置多个间隔计时器(相同类型的警报:ITIMER_REAL)。所以我使用 setitimer() 系统调用来创建 3 个闹钟,每个计时器都有单独的结构来保存时间间隔值。当任何计时器到
我想使用以下 C++ 代码等待预定义的时间(在此示例中始终为 2 秒),但仍可被信号中断(这就是我不使用 sleep 的原因): #include #include #include #incl
当我使用 setitimer 设置一个短超时,然后在 Linux 2.6 上查询设置值(使用 getitimer 或另一个 setitimer)。 26系统(Debian 5.0.5),我得到一个比我
我正在编写代码 fork (3、5 的数字,...不定数)。我希望我的程序在指定的时间后结束( parent 可能首先杀死它的 child 然后自己可能通过调用 _exit 这也是 sig-safe)
我通过 sys/time.h 中的 setitimer 函数在我的 C++ 代码中使用了一个计时器。这会将 SIGALRM 信号映射到我的计时器处理程序方法。在此之后我无法使用 sleep 功能。我假
我已经成功制作了一个虚拟计时器,每当时间周期完成时,它就会向处理函数发送信号: 1)使用setitimer创建定时器(周期长度相等)。2)使用sigaction并实现一个函数处理程序s.t sigac
如何使用 setitimer 配置 3 个以上的定时器? linux 手册页说“系统为每个进程提供三个间隔计时器,每个计时器在不同的时域中递减。当任何计时器到期时,都会向进程发送一个信号,并且计时器(
我想在 linux 2.6+ 的多线程进程中使用 setitimer()(或者不太可能,alarm())和支持 NPTL 的 libc。哪个线程将从内核接收 sigalarm (SIGALRM)? 谢
为了研究 ITMER_REAL 和 ITIMER_VIRTUAL 之间的差异,我编写了以下程序。 #include // exit(), EXIT_FAILURE, EXIT_SUCCESS #
我有以下代码,它按预期工作: import signal def printer(signum, frame): print("hi!") signal.signal(signal.SIGAL
我正在尝试使用 setitimer 发送 SIGALRM,它又调用我的处理函数来打印到标准输出。我已经在互联网上搜索了几个小时,但根本没有明确指示应如何使用 setitimer。我尝试过各种组合,但似
首先让我说这里有很多问题。 我论文的其中一项任务要求我编写一个程序来执行一个子程序,如果它的运行时间(不是 wall-time 而是 user+sys )超过特定值或者它的 RAM 消耗是超过另一个指
Linux下PHP通过setitimer中的ITIMER_PROF来实现ini(max_execution_time)和set_time_limit,而不是ITIMER_REAL。通过谷歌,我在 ph
手册说 setitimer 在整个 PROCESS 中共享,SIGPROF 发送到 PROCESS 而不是线程。 但是当我在我的多线程进程中创建计时器时,除非我为进程中的每个线程创建独立的堆栈来处理信
我是一名优秀的程序员,十分优秀!