1

Присоединение 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 ответ1

3

От man tgkill:

tgkill() отправляет сигнал sig потоку с идентификатором потока tid в группе потоков tgid. (Напротив, kill (2) может использоваться только для отправки сигнала процессу (то есть группе потоков) в целом, и сигнал будет доставлен в произвольный поток внутри этого процесса.)

Что только оставляет нас вопросом о том, что сигнал 0 представляет. Ответ, ни один вообще:

Если у вас есть идентификатор процесса, но вы не уверены, действителен ли он, вы можете использовать для проверки его наиболее вероятного кандидата: команду kill. Если вы не видите ссылки на это на справочной странице kill(1), проверьте информационные страницы. Страница man/info утверждает, что сигнал 0 является особым и что код выхода из kill указывает, может ли сигнал быть отправлен указанному процессу (или процессам).

Таким образом, вызовы tgkill проверяют существование различных потоков в рамках любого процесса, который вы отслеживаете с помощью strace . Возвращаемое значение 0 указывает, что протестированные потоки существуют; вопрос, на который нужно ответить сейчас: почему процесс зацикливается на тесте? (Я предполагаю, что это то, что он делает, во всяком случае; вероятно, если бы он когда-либо делал что-то еще, что вы видели, вы бы упомянули об этом в своем вопросе.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .