So when a command is fired from a shell, fork() inherits a child process of it and exec() loads the child process to the memory and executes.
Não é bem assim. fork()
clona o processo atual, criando uma criança idêntica. exec()
carrega um novo programa no processo atual, substituindo o existente.
My qs is:
If the child process contains all the attributes of the parent process(which is the original process), then what is the need of this child process? The original process also could have been loaded to the memory.
A necessidade é porque o processo pai não quer terminar ainda; ele quer que um novo processo saia e faça algo ao mesmo tempo que continua a executar também.
Does this fork and exec concept apply to all the executable program in UNIX?Like for shell script also or only for commands? Does it also apply for shell builtin commands?
Para comandos externos, o shell faz um fork()
para que o comando seja executado em um novo processo. Builtins são apenas executados diretamente pelo shell. Outro comando notável é exec
, que informa ao shell para exec()
do programa externo sem primeiro fork()
ing. Isso significa que o shell em si é substituído pelo novo programa e, portanto, não está mais disponível para o programa retornar quando ele sai. Se você disser, exec true
, então /bin/true
substituirá seu shell e sairá imediatamente, deixando nada em execução no seu terminal, então ele será fechado.
when copy on write concept is used if I'll execute a command/script?
De volta à era da pedra, fork()
teve que copiar toda a memória no processo de chamada para o novo processo. Copiar em gravação é uma otimização em que as tabelas de páginas são configuradas de modo que os dois processos iniciem o compartilhamento de toda a mesma memória, e somente as páginas gravadas por um ou outro processo são copiadas quando necessário.