fork
Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
— | fork [2023/09/12 16:14] (atual) – criada - edição externa 127.0.0.1 | ||
---|---|---|---|
Linha 1: | Linha 1: | ||
+ | ====== Função fork ====== | ||
+ | |||
+ | Sintaxe: | ||
+ | |||
+ | ''# | ||
+ | |||
+ | |||
+ | '' | ||
+ | |||
+ | ---- | ||
+ | |||
+ | A função '' | ||
+ | |||
+ | A função **fork** é chamada uma única vez (no pai) e retorna duas vezes (uma no processo pai e outra no processo filho). O processo filho herda informações do processo pai: | ||
+ | |||
+ | * Usuários (user id) Real, efetivo. | ||
+ | * Grupos (group id) Real, efetivo. | ||
+ | * Variáveis de ambiente. | ||
+ | * Descritores de arquivos. | ||
+ | * Prioridade | ||
+ | * Todos os segmentos de memória compartilhada assinalados. | ||
+ | * Diretório corrente de trabalho. | ||
+ | * Diretório Raiz. | ||
+ | * Máscara de criação de arquivos. | ||
+ | |||
+ | O processo filho possui as seguinte informações diferente do processo pai: | ||
+ | * PID único dentro do sistema. | ||
+ | * Um PPID diferente. (O PPID do processo filho é o PID do processo pai que inicialmente ativou a função fork). | ||
+ | * O conjunto de sinais pendentes para o processo é inicializado como estando vazio. | ||
+ | * Locks de processo, código e dados não são herdados pelo processo filho. | ||
+ | * Os valores da contabilização do processo obtida pela função time são inicializados com zero. | ||
+ | * Todos os sinais de tempo são desligados. | ||
+ | |||
+ | Caso a função fork retorne 0 (zero), está se executando o processo filho. Caso a função retorne um valor diferente de 0 (zero), mas positivo, o processo pai está sendo executado. O valor retornado representa o PID do processo filho criado. | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | int main(int argc, char *argv[]) | ||
+ | { | ||
+ | pid_t iPid; | ||
+ | |||
+ | | ||
+ | |||
+ | iPid = fork(); | ||
+ | if (iPid < 0) | ||
+ | { | ||
+ | perror(argv[0]); | ||
+ | exit(errno); | ||
+ | } | ||
+ | |||
+ | | ||
+ | { | ||
+ | /* este trecho de código será executado apenas no pai */ | ||
+ | printf(" | ||
+ | printf(" | ||
+ | printf(" | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | printf(" | ||
+ | } | ||
+ | |||
+ | /* este trecho de código será executado apenas no filho, embora o comando if esteja disponível também para o pai */ | ||
+ | | ||
+ | { | ||
+ | printf(" | ||
+ | printf(" | ||
+ | printf(" | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | printf(" | ||
+ | } | ||
+ | |||
+ | /* este código está disponível no pai e no filho */ | ||
+ | | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||