Почему strace/truss иногда "исправляет" застрявшие процессы?
Иногда у вас есть застрявший процесс, который застрял на какое-то время, и как только вы начинаете тыкать в него с помощью strace / truss, просто чтобы посмотреть, что происходит, он волшебным образом отклеивается и продолжает работать! Таким образом, от простого "наблюдения" эти программы оказывают некоторое влияние на работу застрявших программ... что здесь происходит? Стрейс (думаю, через ptrace(2)?) Отправил сигнал, заставляющий программу прекратить блокировку, или что-то подобное?
Я видел это несколько раз - последний раз в Linux RHEL 4 (и Perl-скрипт перебирал процессы и в этом случае выполнял некоторый сетевой ввод-вывод), но также и в некоторых других контекстах. К сожалению, я не могу воспроизвести это, как это случается... во времена кризиса. Но мое любопытство остается.:-)
Любое разъяснение приветствуется.
1 ответ
Может быть, это ошибка в ядре или в программе, которую вы отслеживаете?
Программа, возможно, неправильно реализовала цикл обработки событий, который ожидает неправильные команды, но ожидает других вещей после EINTR
,
Пример:
за(;;) { Выбрать(...); if(FD_SET(...i...)) { чтения (... я...); написать (... J...); // Наивная блокировка записи } }
Это будет работать в тривиальном тесте, но вся программа может блокировать, если какие-либо блоки записи.
Приостановка / возобновление программы отменяет блокировку write
и заставляет основной цикл продолжаться.