Почему strace / truss иногда «исправляет» застрявшие процессы?

1193
Emmel

Иногда у вас есть застрявший процесс, который застрял на какое-то время, и как только вы начинаете тыкать в него с помощью strace / truss, просто чтобы посмотреть, что происходит, он волшебным образом отклеивается и продолжает работать! Таким образом, от простого «наблюдения» эти программы оказывают некоторое влияние на работу застрявших программ ... что здесь происходит? Стрейс (я думаю, через ptrace (2)?) Отправил сигнал, заставляющий программу прекратить блокировку, или что-то подобное?

Я видел это несколько раз - последний раз в Linux RHEL 4 (и сценарий Perl, перелистывающий процессы и выполняющий некоторый сетевой ввод-вывод в этом случае), но также и в нескольких других контекстах. К сожалению, я не могу воспроизвести это, как это случается ... во времена кризиса. Но мое любопытство остается. :-)

Любое разъяснение приветствуется.

4

1 ответ на вопрос

0
Vi.

Может быть, это ошибка в ядре или в программе, которую вы отслеживаете?

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

Пример:

за(;;) { Выбрать(...); if (FD_SET (... i ...)) { чтения (... я ...); написать (... J ...); // Наивная блокирующая запись } } 

Это будет работать в тривиальном тесте, но вся программа может блокировать, если какие-либо блоки записи.

Приостановка / возобновление программы отменяет блокировку writeи приводит к продолжению основного цикла.

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