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 */ | ||
| + | | ||
| + | | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||