首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >setitimer,SIGALRM &多线程进程(linux,c)

setitimer,SIGALRM &多线程进程(linux,c)
EN

Stack Overflow用户
提问于 2010-04-06 17:28:47
回答 2查看 14.6K关注 0票数 17

我希望在带有NPTL的libc的linux setitimer()多线程进程中使用setitimer()(或者不太可能使用alarm())。哪个线程将从内核接收sigalarm (SIGALRM)

谢谢。

2014-04更新:如果我想编写像gperftools的cpuprofile这样的分析实用程序,应该如何在多线程程序中设置setitimer();但在我的工具中,我想支持动态链接的程序(因此可以将我自己的库注入init分析)和静态链接的程序(不可能执行^)。

我当前的分析工具可以在fork()之后和exec()之前设置exec(),它还使用ptrace来控制目标程序,并劫持由setitimer生成的SIGPROF/SIGVPROF/SIGALRM。我不知道多线程程序是如何工作的。

EN

回答 2

Stack Overflow用户

发布于 2010-04-06 17:35:33

来自信号(7)手册页:

可以将进程定向信号传递到当前没有阻止该信号的任何线程。如果多个线程解除了信号阻塞,那么内核将选择一个任意线程来传递信号。

现在,警报(2)手册页说:

闹钟()安排一个SIGALRM信号在几秒钟内传递到进程。

因此,信号被传递到一个进程(信号也可能指向某个线程),因此您不知道哪个线程会接收它。

赛蒂默(2)也是如此

当任何计时器过期时,都会向进程发送信号,并且计时器(可能)重新启动。

除了一个线程之外,您可以在所有线程中阻止SIGALARM,然后可以确定它将被传递到该线程。假设您使用的是线程,则可以使用σ掩码()阻止信号。

票数 15
EN

Stack Overflow用户

发布于 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)。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2586926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档