- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
每个task_struct
在 linux 内核中有一个名为“real timer”的字段,它是一个 struct hrtimer
(高分辨率定时器)。当我们使用 setitimer
设置定时器时,它将进程中的“实时计时器”设置为由给定值到期。当它过期时,名为 it_real_fn
的函数叫做。这是 source code in Linux kernel 2.6.39.4 :
/*
* The timer is automagically restarted, when interval != 0
*/
enum hrtimer_restart it_real_fn(struct hrtimer *timer)
{
struct signal_struct *sig =
container_of(timer, struct signal_struct, real_timer);
trace_itimer_expire(ITIMER_REAL, sig->leader_pid, 0);
kill_pid_info(SIGALRM, SEND_SIG_PRIV, sig->leader_pid);
return HRTIMER_NORESTART;
}
我发现它返回 HRTIMER_NORESTART
,这意味着它不应重新启动。但是,如果我们在调用setitimer
的时候赋了一个时间间隔值,也就是说我们要在每个时间间隔触发定时器,那么“真正的定时器”应该从哪里重启呢?
最佳答案
您说 it_real_fn
函数不会重新启动实时计时器是正确的,但它不是使用 setitimer
时在计时器到期时调用的函数。
setitimer
函数是 POSIX 计时器的一部分,它们的 Linux 实现在 posix-timers.c
中。 , 在这个文件中,函数 posix_timer_fn
,它可能返回 HRTIMER_RESTART
和 HRTIMER_NORESTART
被定义并分配给 struct hrtimer
的 it_real_fn
(代码将此函数设置为计时器回调位于 common_timer_set
中,由 POSIX 计时器初始化调用)。
关于linux - "setitimer()"启动的定时器会重启吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55311981/
我有以下情况 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 而不是线程。 但是当我在我的多线程进程中创建计时器时,除非我为进程中的每个线程创建独立的堆栈来处理信
我是一名优秀的程序员,十分优秀!