Я заметил, что 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:
Checkout Отметить комментарий Плотника для истинного объяснения ПОЧЕМУ.