Que propriedades de um processo não privilegiado são preservadas durante uma chamada 'execve'?

1

Eu estou ensinando um curso de Sistemas Operacionais e tentando me concentrar na técnica fork / execve para criar novos processos.

Meu entendimento atual é que um fork faz uma cópia completa do processo antigo, estabelece um novo relacionamento PID e pai / filho, mas de outra forma faz muito pouco mais.

Por outro lado, depois que o processo filho é criado, ele executa execve para substituir a maior parte de sua memória pelo novo processo. Por exemplo, o código do programa, pilha e heap são completamente substituídos e iniciados do zero como um novo programa.

Mas nem tudo é substituído no novo processo. O processo filho herda os descritores de arquivo (que permitem que os pipes sejam configurados antes do execve), o ID do processo (PID) e o ID do usuário (UID) e algumas permissões ( página de manual ).

Eu imagino que a lista completa de propriedades que NÃO são substituídas por uma chamada execve é bastante longa, mas existem outras propriedades-chave como as que eu mencionei acima que estão faltando?

    
por Josiah Yoder 22.09.2018 / 21:49

1 resposta

4

Já que estamos discutindo o Linux especificamente (pelo menos, eu entendo que é o que você quer desde que você usou o ), o fork e As páginas de manual execve são as referências apropriadas; eles listam todos os atributos que não são preservados. A maior parte desse comportamento é especificada pelo POSIX, mas existem algumas especificidades do Linux.

As páginas de manual não listam atributos que são preservados, concentrando-se naqueles que não são:

All process attributes are preserved during an execve(), except the following:

etc.

Não tentarei responder à sua pergunta listando todos os atributos que são preservados. No entanto, mostrarei uma propriedade-chave que é preservada e que você não listou: os sinais padrão ignorados e preservados são preservados em execve . Isso significa que um pai pode ignorar um sinal (pelo menos, sinais que podem ser ignorados) e esse comportamento será propagado para qualquer filho. Isso é o que permite que nohup funcione.

Você pode encontrar uma lista completa dos atributos do processo, com uma explicação do que acontece com eles em exec() ou fork() , na seção 28.4 de A Interface de Programação Linux .

    
por 22.09.2018 / 22:30