- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我想在 linux 2.6+ 的多线程进程中使用 setitimer()
(或者不太可能,alarm()
)和支持 NPTL 的 libc。哪个线程将从内核接收 sigalarm (SIGALRM)
?
谢谢。
2014-04 更新:如果我想编写像 gperftools 的 cpuprofile 这样的分析工具,我应该如何在多线程程序中设置 setitimer()
;但在我的工具中,我想同时支持动态链接程序(因此可以将我自己的库注入(inject)到初始化分析中)和静态链接程序(不可能做 ^^^^^^)。
我当前的分析工具在 fork()
之后和 exec()
之前设置 setitimer
,它还使用 ptrace
来控制目标程序并劫持 setitimer
生成的 SIGPROF/SIGVPROF/SIGALRM。我不知道它如何与多线程程序一起工作。
最佳答案
来自 signal(7)手册页:
A process-directed signal may be delivered to any one of the threads that does not currently have the signal blocked. If more than one of the threads has the signal unblocked, then the kernel chooses an arbitrary thread to which to deliver the signal.
现在,alarm(2)手册页说:
alarm() arranges for a SIGALRM signal to be delivered to the process in seconds seconds.
因此,信号被传送到一个进程(一个信号也可能被定向到某个线程),因此您不知道哪个线程会收到它。
与setitimer(2)相同:
When any timer expires, a signal is sent to the process, and the timer (potentially) restarts.
您可以在除一个线程之外的所有线程中阻止 SIGALARM
,然后您可以确定它会被传送到唯一的线程。假设您正在使用 pthreads,您可以使用 pthread_sigmask() 来阻止信号.
关于linux - setitimer, SIGALRM & 多线程进程 (linux, c),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2586926/
我有以下情况 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 而不是线程。 但是当我在我的多线程进程中创建计时器时,除非我为进程中的每个线程创建独立的堆栈来处理信
我是一名优秀的程序员,十分优秀!