То, почему не делает SIGINT, поймано здесь?

Что продолжается здесь? Я думал, что SIGINT будет отправлен группе приоритетного процесса.

(Я думаю, возможно, что система () действительно ли выполнение является оболочкой, которая создает новую группу процесса для дочернего процесса? Кто-либо может подтвердить это?)

% perl
local $SIG{INT} = sub { print "caught signal\n"; };
system('sleep', '10');

Затем хит ctrl+d затем ctrl+c сразу и уведомление, которое "поймало сигнал", никогда не печатается.

Я чувствую, что это - простая вещь... так или иначе для работы вокруг этого? Проблема состоит в том, что при выполнении набора команд через системные результаты в содержании ctrl+c, пока все повторения не завершаются (потому что жемчуг никогда не получает SIGINT), и является довольно раздражающим...

Как это может работаться вокруг? (Я уже протестировал ветвление использования () непосредственно, и поймите, что это работает..., это не приемлемое решение в это время),

ОБНОВЛЕНИЕ: отметьте, это не имеет никакого отношения ко "сну", только то, что команда занимает некоторое произвольное долгое количество времени для выполнения, который является значительно больше, чем тот из жемчуга вокруг этого. Так так, чтобы нажатие ctrl+c отправляется в команду (как в группе приоритетного процесса?) и так или иначе умеет никогда не быть отправленным в жемчуг.

7
задан dlamotte 14 July 2010 в 16:29
поделиться

2 ответа

from perldoc system:

Поскольку SIGINT и SIGQUIT игнорируются во время выполнения system, если вы ожидаете, что ваша программа завершится при получении этих сигналов, вам нужно будет организовать это самостоятельно на основе возвращаемого значения.

@args = ("command", "arg1", "arg2");
system(@args) == 0
 или die "system @args failed: $?".

Если вы хотите вручную проверить отказ системы, вы можете проверить все возможные проверив $? следующим образом:

if ($? == -1) {
 print "failed to execute: $!\n";
}
elsif ($? & 127) {
 printf "ребенок умер с сигналом %d, %s coredump\n",
 ($? & 127), ($? & 128) ? 'with' : 'without';
}
else {
 printf "ребенок вышел со значением %d\n", $? >> 8;
}

Альтернативно, вы можете проверить значение ${^CHILD_ERROR_NATIVE} с помощью вызовов W*() из модуля POSIX

4
ответ дан 7 December 2019 в 14:28
поделиться

Я не совсем понимаю, чего вы пытаетесь добиться... но вы пробовали просто сравнить с:

perl -wle'local $SIG{INT} = sub { print "caught signal"; }; sleep 10;'

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

0
ответ дан 7 December 2019 в 14:28
поделиться
Другие вопросы по тегам:

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