Вызывает ли bash `execve()`, не внося дополнительных изменений в то, как `execve()` обрабатывает диспозиции сигналов?

Вызывает ли bash `execve()`, не внося дополнительных изменений в то, как `execve()` обрабатывает диспозиции сигналов?

В руководстве Bash говорится:

Когда необходимо выполнить простую команду, отличную от встроенной или функции оболочки, ... ловушки, пойманные оболочкой, сбрасываются взначения, унаследованные от родителя оболочки, а ловушки, игнорируемые оболочкой, игнорируются

страница руководства execve()говорит

Во время execve(2) расположения обработанных сигналов сбрасываются напо умолчанию; диспозиции проигнорированных сигналов остаются неизменными."

Являются ли «значения по умолчанию» и «значения, унаследованные от родителя оболочки» одним и тем же?

Вызывает ли bash вызовы execve()без внесения дополнительных изменений в execve()обработку сигналов?

Спасибо.

решение1

Нет, "по умолчанию" и "значения, унаследованные от родителя оболочки" не одно и то же. В случае execve "по умолчанию" относится к SIG_DFL, что вызывает действие по умолчанию, как указаноman 7 signal. В случае bash «значения, унаследованные от родителя оболочки» означает именно то, что говорится; если такой сигнал был проигнорирован ( SIG_IGN) его родителем, он будет проигнорирован и его потомком.

Ключом к пониманию того, что здесь происходит, является слово "handled". Оно относится к пользовательской функции обработчика сигналов, отличной от или SIG_DFL. SIG_IGNОна должна быть сброшена execve, так как новый процесс не будет иметь функцию обработчика сигналов, которую использовал старый процесс.

Обратите внимание, что более новые версии страницы руководства execve называют "обработанные" сигналы "перехваченными" сигналами, чтобы соответствовать терминологии, используемой в остальной части Linux. Это все еще отличается от сигналов по умолчанию и игнорируемых сигналов.

Простая версия: если либо bash, либо родительский элемент bash имели сигнал, помеченный как SIG_IGN, он будет SIG_IGNи в новом потомке. В противном случае он будет и SIG_DFLв новом потомке. Он никогда не может быть обработчиком в новом потомке, поскольку в новом потомке не будет обработчика из bash или его родителя.

Связанный контент