我希望在带有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
发布于 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
复制相似问题