Почему комментирование функции прерывания позволяет работать с control-c?

Объедините файлы, отсортируйте объединенный файл и удалите ненужные столбцы.

В данном случае поле 1 из /etc/passwd должно быть объединено с полем 1 из /etc/shadow, с : в качестве разделителя полей.

join -t : -1 1 -2 1 /etc/passwd /etc/shadow |
sort -t : -k 3,3n |
cut -d : -f 1,8-
2
06.05.2016, 00:59
3 ответа

Данная команда trap приказала оболочке перехватить эти сигналы:

1 SIGHUP
2 SIGINT
3 SIGQUIT
15 SIGTERM

"" - это команда, которая запускается при получении одного из этих сигналов. Другими словами, ничего не делайте; полностью игнорировать сигналы.

Вы можете увидеть, какие символы связаны с сигналами, используя stty -a , например, во второй строке вывода из stty в этом примере (формат зависит от системы, в которой вы используются):

$ stty -a
speed 38400 baud; rows 40; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke

Соответствие между некоторыми символами и сигналами приведено в 11.1.9 Специальные символы , например,

  • intr отправляет SIGINT
  • quit отправляет SIGQUIT

, чтобы мой ^ C отправлял SIGINT (ваша конфигурация может отличаться).

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

Дополнительная литература:

3
27.01.2020, 21:56

trap - это встроенная оболочка, нормальный формат - trap cmd list_of_signals . cmd в вашем случае пуст, т.е. игнорируйте этот сигнал. 1 - это сигнал зависания , 3 - это intr или Ctrl-C . См. man bash Раздел Встроенные команды оболочки для дальнейшего объяснения.

0
27.01.2020, 21:56

Нажатие Ctrl + C в терминале отправляет сигнал SIGINT процессу, запущенному в терминале. (Точнее, для всех процессов в группе процессов переднего плана; например, если вы запускаете foo | tail -f , то сигнал отправляется как на foo , так и на tail .)

Традиционное значение SIGINT (INTerrupt signal) - «прервать текущую задачу и вернуться к интерактивной подсказке». Программы, у которых нет интерактивной подсказки, такой как tail, просто закрываются, чтобы командная оболочка взяла на себя управление.

Команда trap определяет поведение оболочки при получении сигнала. Например, trap 'echo kill' INT заставляет оболочку print убивать , когда она получает сигнал SIGINT. trap 'echo kill' 2 то же самое на ПК с Linux, потому что 2 - это номер сигнала с именем INT. Это срабатывает только в том случае, если оболочка получает сигнал, она не запускается, если другая программа находится на переднем плане.

trap "" INT - особый случай. Он не просто приказывает оболочке ничего не делать, когда она получает сигнал, она приказывает оболочке игнорировать сигнал. Когда процесс регистрирует обработчик сигнала, это не влияет на запускаемые им программы - обработчик - это код в процессе, и не будет возможности вызвать его из другой программы. Но игнорирование сигнала - это другая настройка, и она сохраняется, когда программа запускает другую программу.Итак, после trap "" INT , когда вы запускаете tail , сигнал по-прежнему игнорируется, и нажатие Ctrl + C не имеет никакого эффекта .

Если вы хотите по-прежнему эффективно игнорировать сигналы в оболочке, но не в программах, которые она запускает, установите непустую ловушку, например trap "" INT или trap: INT (: - это команда оболочки без операций). В качестве альтернативы, запустите trap - INT перед запуском tail , чтобы сбросить обработку сигналов до состояния по умолчанию, не игнорируемого.

2
27.01.2020, 21:56

Теги

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