
Bash не имеет специального обработчика для SIGQUIT и не участвует в процессе создания дампа ядра. Ядро записывает дамп ядра как часть "действия по умолчанию" для SIGQUIT, если и только если rlimit для дампов ядра достаточно большой; этот rlimit мог быть установлен при входе в систему в соответствии с тем, что он говорит в limits.conf, или он мог быть скорректирован вручную с помощью ulimit или чего-то еще.
Я не совсем понимаю, что «в Bash нет специального обработчика для SIGQUIT».
Верно ли, что у каждого процесса есть обработчики сигналов, даже если некоторые из них являются обработчиками сигналов по умолчанию, и обычно процесс получает свои обработчики сигналов по умолчанию, из fork()
которых копирует обработчики сигналов из своего родительского процесса, и execve()
не изменяет обработчики сигналов?
Откуда процесс bash берет обработчики сигналов/ловушки по умолчанию?
В APUE я не могу найти, является ли login
(или getty
какая-то другая программа в последовательности запуска) первой программой, которая устанавливает обработчики сигналов по умолчанию (а также ограничения ресурсов из /etc/security/limits.conf
, что является центральной темой по ссылке) и передает их в оболочку входа:
Если мы правильно войдём в систему, вход будет
• Перейдите в наш домашний каталог (chdir)
• Измените владельца нашего терминального устройства (chown), чтобы мы стали его владельцами.
• Измените права доступа к нашему терминальному устройству, чтобы у нас было разрешение на чтение и запись на него.
• Установите идентификаторы наших групп, вызвав setgid и initgroups
• Инициализируйте среду со всей информацией, которая есть у входа: наш домашний каталог (HOME), оболочка (SHELL), имя пользователя (USER и LOGNAME) и путь по умолчанию (PATH)
• Измените наш идентификатор пользователя (setuid) и вызовите нашу оболочку входа, как в
execl("/bin/sh", "-sh", (char *)0);