Что такое SIG_0 при взгляде на полосу
Присоединение strace к процессу, использующему большое количество процессоров, показывает, что pid "убивается" снова и снова.
Процесс использует 130% процессорного времени. Что такое tgkill( SIG_0)?
strace -p 3876
nanosleep({0, 100000}, NULL) = 0
tgkill(3876, 3884, SIG_0) = 0
tgkill(3876, 3885, SIG_0) = 0 ...repeats over and over.
1 ответ
От man tgkill
:
tgkill () отправляет сигнал sig потоку с идентификатором потока tid в группе потоков tgid. (Напротив, kill(2) может использоваться только для отправки сигнала процессу (то есть группе потоков) в целом, и сигнал будет доставлен в произвольный поток внутри этого процесса.)
Что только оставляет нам вопрос о том, что представляет сигнал 0. Ответ, ни один вообще:
Если у вас есть идентификатор процесса, но вы не уверены, что он действителен, вы можете использовать для проверки его наиболее вероятного кандидата: команду kill. Если вы не видите ссылки на это на справочной странице kill(1), проверьте информационные страницы. Страница man/info утверждает, что сигнал 0 является особым, и что код выхода из kill указывает, может ли сигнал быть отправлен указанному процессу (или процессам).
tgkill
вызовы, таким образом, проверяют наличие различных потоков в любом процессе, через который вы отслеживаете strace
, Возвращаемое значение 0 указывает, что протестированные потоки существуют; вопрос, на который нужно ответить сейчас: почему процесс зацикливается на тесте? (Я предполагаю, что это то, что он делает, во всяком случае; вероятно, если бы он когда-либо делал что-то еще, что вы видели, вы упомянули бы это в своем вопросе.)