Я хочу использовать setitimer()
(или менее вероятный, alarm()
) в многопоточном процессе в linux 2.6 + с NPTL-поддерживающим libc. Который получит поток sigalarm (SIGALRM)
от ядра?
Спасибо.
2014-04 обновления: Как я должен установить setitimer()
в многопоточной программе, если я хочу записать профильную утилиту как cpuprofile gperftools; но в моем инструменте я хочу поддерживать обе динамично связанных программы (таким образом, возможно ввести мою собственную библиотеку к init, представляющему), и статически связанные программы (без возможности выполнения ^^^^^^).
Мой текущий профильный инструмент работает с установкой setitimer
сразу после fork()
и прежде exec()
, и это также использует ptrace
получить контроль над целевой программой и угнать SIGPROF/SIGVPROF/SIGALRM, сгенерированный setitimer
. У меня нет точной идеи, как это работает с многопоточными программами.
Из signal (7) справочная страница:
Управляемый процессом сигнал может быть доставлен в любой из потоков , который в настоящее время не имеет Сигнал заблокирован. Если более чем в одном из потоков сигнал разблокирован, тогда ядро выбирает произвольный поток , которому следует доставить сигнал.
Теперь на странице руководства alarm (2) указано, что:
alarm () организует доставку сигнала SIGALRM процессу в течение секунд секунд. .
Итак, сигнал доставляется процессу (сигнал также может быть направлен в определенный поток), и поэтому вы не знаете, какой из потоков его получит.
То же самое с setitimer (2) :
По истечении любого таймера сигнал отправляется процессу, и таймер (потенциально) перезапускается .
Вы можете заблокировать SIGALARM
во всех ваших потоках, кроме одного, тогда вы можете быть уверены, что он будет доставлен только этому потоку. Предполагая, что вы используете pthreads, вы можете блокировать сигналы с помощью pthread_sigmask () .