Я заметил, что sleep
не может быть убит SIGINT при порождении:
(sleep 1000 &)
Интересно, почему это так.
SIGINT уничтожает все следующее:
sleep 1000
sleep 1000 &
(sleep 1000)
( ( (sleep 1000) ) )
( ( (sleep 1000)& ) )
, поэтому я считаю, что это должно иметь какое-то отношение к неинтерактивному bash (для ввода в подоболочку требуются скобки), и задача должна быть бегать в фоновом режиме.
Я написал короткую C программу для проверки поведения и обнаружил, что sa_handler установлен в SIG_IGN - объяснение явления, но почему именно так?
Я не нашел никакой информации, является ли это предполагаемой функцией (хотя, учитывая объем руководства, я, возможно, просто пропустил ее), и если да, то какова была причина, по которой это произошло.
Я включаю C код для тех, кто заинтересован:
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
int main() {
struct sigaction oldact;
if(sigaction(SIGINT, NULL, &oldact) != 0) {
printf("Error in sigaction\n");
exit(1);
}
if(oldact.sa_flags & SA_SIGINFO) {
printf("Using sa_sigaction\n");
} else {
if(oldact.sa_handler == SIG_DFL) {
printf("Default action\n");
} else if(oldact.sa_handler == SIG_IGN) {
printf("Ignore signal\n");
} else {
printf("Other action\n");
}
}
return 0;
}
РЕДАКТИРОВАТЬ:
ответ Пилкроу отлично, и я принял его. Я хотел бы добавить к , почему posix говорит так, что согласно signal (7) и SIGINT, и SIGQUIT находятся с клавиатуры . Поэтому имеет смысл игнорировать их в процессах, отсоединенных от одного (а не задания, управляемого bash).
EDIT2:
Оформить заказ Пометить комментарий Плотника для истинного объяснение ПОЧЕМУ.