osg*_*sgx 15 linux multithreading profiling signals linux-kernel
我想在linux 2.6+中使用支持NPTL的libc的多线程进程中使用setitimer()(或者不太可能alarm()).哪个线程sigalarm (SIGALRM)将从内核接收?
谢谢.
2014-04更新:setitimer()如果我想编写像gperftools的cpuprofile这样的分析实用程序,我应该如何设置多线程程序; 但在我的工具中,我想支持两个动态链接的程序(因此可以将自己的库注入init初始化)和静态链接的程序(不可能做^^^^^^).
我当前的分析工具setitimer只使用fork()之前exec()和之后的设置,它还用于ptrace控制目标程序并劫持由生成的SIGPROF/SIGVPROF/SIGALRM setitimer.我不知道它如何与多线程程序一起工作.
paj*_*ton 14
来自signal(7)手册页:
可以将过程引导的信号传递到当前没有阻塞信号的任何一个线程.如果多个线程的信号未被阻塞,则内核选择一个任意线程来传递信号.
现在,alarm(2)手册页说:
alarm()安排SIGALRM信号在几秒钟内传递给进程.
因此,信号被传递到进程(信号也可能被指向某个线程),因此您不知道哪个线程将接收它.
与setitimer(2)相同:
当任何计时器到期时,会向进程发送一个信号,并且计时器(可能)重新启动.
您可以阻止SIGALARM所有线程,除了一个,然后您可以确定它将被传递到该唯一的线程.假设您正在使用pthread,则可以使用pthread_sigmask()阻止信号.
有在LKML有趣的话题,2010年https://lkml.org/lkml/2010/4/11/81:" setitimer与线程:SIGALRM返回哪个线程(过程主控器或个人的孩子)? "的弗朗齐歇克Rysanek(cz).作者说setitimer在Fedora 5之前至少有一次使用每线程信号:
...
setitimer()具有每线程粒度.它用于将SIGALRM定时器传递给调用的特定线程setitimer().
但是在最近的Fedora中,行为发生了变化("man pthreads",......"线程不共享间隔定时器(在内核2.6.12中修复).")
在主题中,Andi Kleen(英特尔)建议切换到 " POSIX timers(timer_create) "; 在ML线程中, Davide Libenzi建议timerfd在非古老的Linux上使用(timerfd_create,timerfd_settime).