O bash chama 'execve ()' sem fazer mais alterações em como 'execve ()' trata as disposições do sinal?

1

O manual do Bash diz

When a simple command other than a builtin or shell function is to be executed, ... traps caught by the shell are reset to the values inherited from the shell’s parent, and traps ignored by the shell are ignored

página de manual execve () diz

During an execve(2), the dispositions of handled signals are reset to the default; the dispositions of ignored signals are left unchanged."

O "padrão" e "os valores herdados do pai da shell" são os mesmos?

O bash chama execve() sem fazer mudanças adicionais em como execve() trata as disposições do sinal?

Obrigado.

    
por Tim 30.05.2018 / 20:22

1 resposta

2

Não, "o padrão" e "os valores herdados do pai da shell" não são os mesmos. No caso do execve, "o padrão" refere-se a SIG_DFL , que faz com que a ação padrão seja especificada por man 7 signal . No caso de bash, "os valores herdados do pai da shell" significam exatamente o que ela diz; se tal sinal foi ignorado ( SIG_IGN ) por seu pai, ele será ignorado em seu filho também.

Uma chave para entender o que está acontecendo aqui é a palavra "manipulada". Refere-se a uma função de manipulador de sinal personalizada, distinta de SIG_DFL ou SIG_IGN . Ele deve ser redefinido por execve, pois o novo processo não terá a função de manipulador de sinal usada pelo processo antigo.

Observe que as versões mais recentes da página de manual execve referem-se aos sinais "manipulados" como sinais "capturados", para estarem de acordo com a terminologia usada pelo restante do Linux. Isso ainda é distinto dos sinais padrão e ignorados.

Versão simples: se o pai do bash ou do bash tiver um sinal marcado como SIG_IGN , será SIG_IGN no novo filho também. Caso contrário, será SIG_DFL no novo filho. Ele nunca pode ser um manipulador no novo filho, já que nenhum manipulador do bash ou seu pai existirá no novo filho.

    
por 07.09.2018 / 04:20

Tags