4

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

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

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

1 ответ1

0

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

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

Пример:

for(;;) {
  select(...);
  if(FD_SET(...i...)) {
    read(...i...);
    write(...j...); // Naive blocking write
  }
}

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

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

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