setitimer, SIGALRM и процесс мультипотока (Linux, c)

Я хочу использовать setitimer() (или менее вероятный, alarm()) в многопоточном процессе в linux 2.6 + с NPTL-поддерживающим libc. Который получит поток sigalarm (SIGALRM) от ядра?

Спасибо.

2014-04 обновления: Как я должен установить setitimer() в многопоточной программе, если я хочу записать профильную утилиту как cpuprofile gperftools; но в моем инструменте я хочу поддерживать обе динамично связанных программы (таким образом, возможно ввести мою собственную библиотеку к init, представляющему), и статически связанные программы (без возможности выполнения ^^^^^^).

Мой текущий профильный инструмент работает с установкой setitimer сразу после fork() и прежде exec(), и это также использует ptrace получить контроль над целевой программой и угнать SIGPROF/SIGVPROF/SIGALRM, сгенерированный setitimer. У меня нет точной идеи, как это работает с многопоточными программами.

15
задан osgx 14 April 2014 в 01:14
поделиться

1 ответ

Из signal (7) справочная страница:

Управляемый процессом сигнал может быть доставлен в любой из потоков , который в настоящее время не имеет Сигнал заблокирован. Если более чем в одном из потоков сигнал разблокирован, тогда ядро ​​выбирает произвольный поток , которому следует доставить сигнал.

Теперь на странице руководства alarm (2) указано, что:

alarm () организует доставку сигнала SIGALRM процессу в течение секунд секунд. .

Итак, сигнал доставляется процессу (сигнал также может быть направлен в определенный поток), и поэтому вы не знаете, какой из потоков его получит.

То же самое с setitimer (2) :

По истечении любого таймера сигнал отправляется процессу, и таймер (потенциально) перезапускается .

Вы можете заблокировать SIGALARM во всех ваших потоках, кроме одного, тогда вы можете быть уверены, что он будет доставлен только этому потоку. Предполагая, что вы используете pthreads, вы можете блокировать сигналы с помощью pthread_sigmask () .

14
ответ дан 1 December 2019 в 03:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: