%60%20sem%20fazer%20mais%20altera%C3%A7%C3%B5es%20em%20como%20%60execve()%60%20trata%20as%20disposi%C3%A7%C3%B5es%20do%20sinal%3F.png)
O manual do Bash diz
Quando um comando simples diferente de uma função interna ou shell deve ser executado, ... as armadilhas capturadas pelo shell são redefinidas paraos valores herdados do pai do shell, e as armadilhas ignoradas pelo shell são ignoradas
Durante um execve(2), as disposições dos sinais manipulados são redefinidas parao padrão; as disposições dos sinais ignorados permanecem inalteradas."
"O padrão" e "os valores herdados do pai do shell" são iguais?
O bash chama execve()
sem fazer mais alterações na forma como execve()
trata as disposições do sinal?
Obrigado.
Responder1
Não, "o padrão" e "os valores herdados do pai do shell" não são iguais. No caso de execve, "o padrão" refere-se a SIG_DFL
, o que faz com que a ação padrão seja especificada porman 7 signal
. No caso do bash, “os valores herdados do pai do shell” significa exatamente o que diz; se tal sinal foi ignorado ( SIG_IGN
) pelo seu pai, ele também será ignorado pelo seu filho.
Uma chave para entender o que está acontecendo aqui é a palavra “manipulado”. Refere-se a uma função de manipulador de sinal personalizada, distinta de SIG_DFL
ou SIG_IGN
. Deve ser redefinido pelo execve, pois o novo processo não terá a função de manipulador de sinal que o processo antigo utilizava.
Observe que as versões mais recentes da página de manual execve referem-se aos sinais "tratados" como sinais "capturados", para estar alinhado com a terminologia usada pelo resto do Linux. Isso ainda é distinto dos sinais padrão e ignorados.
Versão simples: se o bash ou o pai do bash tiver um sinal marcado como SIG_IGN
, ele também estará SIG_IGN
no novo filho. Caso contrário, estará SIG_DFL
no novo filho. Nunca poderá ser um manipulador no novo filho, pois nenhum manipulador do bash ou de seu pai existirá no novo filho.