http://www.csl.mtu.edu/cs4411/www/notes/process/fork/create.html FORK() SYSTEM CALL * UTILIZADO PARA CRIAR SUBPROCESSO * PROCESSO QUE CRIA É PAI * PROCESSO CRIADO É O FILHO * APÓS A CRIAÇÃO AMBOS OS PROCESSO EXECUTAM A PRÓXIMA INSTRUÇÃO APÓS A SYSTEM CALL FORK() * FORK RETORNA UM VALOR NEGATIVO QUANDO OCORRE UM ERRO * FORK RETORNA ZERO NO PROCESSO FILHO * FORK RETORNA UM VALOR DIFERENTE DE ZERO NO PROCESSO PAI #include <stdio.h> #include <string.h> #include <sys/types.h> #define MAX_COUNT 200 #define BUF_SIZE 100 void main(void) pid_t pid; int i; char buf[buf_size]; fork(); pid = getpid(); for (i = 1; i <= MAX_COUNT; i++) sprintf(buf, "This line is from pid %d, value = %d\n", pid, i); write(1, buf, strlen(buf));
* APÓS A CHAMADA DA SYSTEM CALL FORK, EXISTE UMA CÓPIA EXATA DO ESPAÇO DE ENDEREÇAMENTO DO PROCESSO PAI E FILHO * AMBOS OS PROCESSOS EXECUTAM A PRÓXIMA INSTRUÇÃO APÓS O FORK
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.
RESULTADO DA EXECUÇÃO PAI = 6198 FILHO = 6199 This line is from pid 6199, value = 1 This line is from pid 6199, value = 2 This line is from pid 6199, value = 3 This line is from pid 6199, value = 4 This line is from pid 6199, value = 5 This line is from pid 6199, value = 6 This line is from pid 6199, value = 7 This line is from pid 6199, value = 8 This line is from pid 6199, value = 9 This line is from pid 6199, value = 10 This line is from pid 6198, value = 1 This line is from pid 6198, value = 2 This line is from pid 6198, value = 3 This line is from pid 6198, value = 4 This line is from pid 6198, value = 5 This line is from pid 6198, value = 6 This line is from pid 6198, value = 7 This line is from pid 6198, value = 8 This line is from pid 6198, value = 9 This line is from pid 6198, value = 10
#include <stdio.h> #include <sys/types.h> #define MAX_COUNT 200 void ChildProcess(void); /* child process prototype */ void ParentProcess(void); /* parent process prototype */ void main(void) pid_t pid; pid = fork(); if (pid == 0) ChildProcess(); else ParentProcess(); void ChildProcess(void) int i; for (i = 1; i <= MAX_COUNT; i++) printf(" This line is from child(%d), value = %d\n", getpid(), i); sleep(1); printf(" *** Child process is done ***\n"); void ParentProcess(void) int i; //wait(); for (i = 1; i <= MAX_COUNT; i++) printf("this line is from parent(%d), value = %d\n", getpid(), i); sleep(1); printf("*** Parent is done ***\n");
NO EXEMPLO ANTERIOR, A SYSTEM CALL FORK() RETORNA O PID DO PROCESSO FILHO NA VARIÁVEL PID DO PAI, E ZERO NA VARIAVEL PID DO PROCESSO FILHO. APÓS A EXECUÇÃO DA SYSTEM CALL FORK(), PAI E FILHO ESTÃO NO MESMO PONTO DE EXECUÇÃO DE CÓDIGO
PAI E FILHO INICIAM A EXECUTAÇÃO NA MESMA INSTRUÇÃO APÓS A SYSTEM CALL FORK()
PROCESSO PAI EXECUTA A FUNÇÃO PARENTPROCESS E PROCESSO FILHO EXECUTA A FUNÇÃO CHILDPROCESS
RESULTADO DA EXECUÇÃO SEM A SYSTEM CALL WAIT() This line is from parent(6605), value = 1 This line is from child(6606), value = 1 This line is from parent(6605), value = 2 This line is from child(6606), value = 2 This line is from parent(6605), value = 3 This line is from child(6606), value = 3 This line is from parent(6605), value = 4 This line is from child(6606), value = 4 This line is from parent(6605), value = 5 This line is from child(6606), value = 5 This line is from child(6606), value = 6 This line is from parent(6605), value = 6 This line is from child(6606), value = 7 This line is from parent(6605), value = 7 This line is from child(6606), value = 8 This line is from parent(6605), value = 8 This line is from child(6606), value = 9 This line is from parent(6605), value = 9 This line is from child(6606), value = 10 This line is from parent(6605), value = 10 *** Child process is done *** *** Parent is done ***
RESULTADO DA EXECUÇÃO COM A SYSTEM CALL WAIT() This line is from child(6664), value = 1 This line is from child(6664), value = 2 This line is from child(6664), value = 3 This line is from child(6664), value = 4 This line is from child(6664), value = 5 This line is from child(6664), value = 6 This line is from child(6664), value = 7 This line is from child(6664), value = 8 This line is from child(6664), value = 9 This line is from child(6664), value = 10 *** Child process is done *** This line is from parent(6663), value = 1 This line is from parent(6663), value = 2 This line is from parent(6663), value = 3 This line is from parent(6663), value = 4 This line is from parent(6663), value = 5 This line is from parent(6663), value = 6 This line is from parent(6663), value = 7 This line is from parent(6663), value = 8 This line is from parent(6663), value = 9 This line is from parent(6663), value = 10 *** Parent is done ***