我希望在带有NPTL的libc的linux setitimer()多线程进程中使用setitimer()(或者不太可能使用alarm())。哪个线程将从内核接收sigalarm (SIGALRM)?
谢谢。
2014-04更新:如果我想编写像gperftools的cpuprofile这样的分析实用程序,应该如何在多线程程序中设置setitimer();但在我的工具中,我想支持动态链接的程序(因此可以将我自己的库注入init分析)和静态链接的程序(不可能执行^)。
我当前的分析工具可以在fork()之后和exec()之前设置exec(),它还使用ptrace来控制目标程序,并劫持由setitimer生成的SIGPROF/SIGVPROF/SIGALRM。我不知道多线程程序是如何工作的。
发布于 2010-04-06 17:35:33
来自信号(7)手册页:
可以将进程定向信号传递到当前没有阻止该信号的任何线程。如果多个线程解除了信号阻塞,那么内核将选择一个任意线程来传递信号。
现在,警报(2)手册页说:
闹钟()安排一个SIGALRM信号在几秒钟内传递到进程。
因此,信号被传递到一个进程(信号也可能指向某个线程),因此您不知道哪个线程会接收它。
赛蒂默(2)也是如此
当任何计时器过期时,都会向进程发送信号,并且计时器(可能)重新启动。
除了一个线程之外,您可以在所有线程中阻止SIGALARM,然后可以确定它将被传递到该线程。假设您使用的是线程,则可以使用σ掩码()阻止信号。
发布于 2014-04-14 00:59:33
在2010年的https://lkml.org/lkml/2010/4/11/81中,LKML中有一个有趣的话题: Frantisek (cz)的“setitimervs.sIGALRM返回到哪个线程?(进程主线程还是单个子线程)”。作者说,setitimer至少在Fedora 5之前使用过每个线程的信号:
.
setitimer()有单线程粒度.它用于将一个SIGALRM从计时器传递到调用setitimer()的特定线程。
但是在最近的Fedoras中,这种行为被改变了(“manp线程”,“线程不共享间隔定时器(在内核2.6.12中修正)”)。
在这一主题中,Andi Kleen (英特尔) 建议切换到 "POSIX计时器(http://pubs.opengroup.org/onlinepubs/7908799/xsh/timer_create.html)";在毫升螺纹 Davide Libenzi中,建议在非古代Linuxes上使用timerfd (timerfd_create,timerfd_settime)。
https://stackoverflow.com/questions/2586926
复制相似问题