http://www.csl.mtu.edu/cs4411/www/notes/process/fork/create.html



Documentos relacionados
Processos em Unix. Conteúdo: Definição de Processos em Unix Estrutura, tipo e escalonamento de processos em Unix Processos, Pai, Filho e Zumbi.

Manipulação de processos

MÓDULO 02 PROCESSOS E THREADS PROCESSOS e THREADS

Um processo sob UNIX ocupa uma área de memória formada basicamente por 3 partes:

E.E.E.P. Dr. Solon Tavares Sistemas Operacionais Prof. Henrique Cordeiro. Programação Concorrente em Linux

LABORATÓRIO SISTEMAS OPERACIONAIS

SVCs para Controle de Processos no Unix. Sistemas Operacionais

Sistemas Operacionais

SVCs para Controle de Processos no Unix (cont.) Sistemas Operacionais

Sistemas Operacionais INF Prof. José Gonçalves

Processos. Programas e Processos. Aula 1 - Chamadas ao sistema. José Pedro Oliveira fork exit getpid, getppid wait, waitpid

Processos. Estados principais de um Processo: Contexto de um Processo. Nível de um Processo.

Comunicação entre pai e filho

INF 1005 Programação I

INF 1620 P1-10/04/02 Questão 1 Nome:

Trabalhando com Processos e Threads em Ambiente LINUX

6. Comunicação entre processos - Pipes

Comunicação entre Processos Memória Compartilhada

Sistemas Operacionais e Introdução à Programação. Programação com linguagem C

Projeto: Camada Independente de Dispositivo

TROCA DE MENSAGENS SOCKETS. Comunicando processos através de SOCKETS. SOCKETS com conexão. SOCKETS sem conexão

Conceitos de Sistemas Operacionais: Chamadas de Sistema. Prof Rafael J. Sandim

Analise o código abaixo:

Comunicação entre Processos

3. Criação e terminação de processos

ponteiros INF Programação I Prof. Roberto Azevedo

Criação de Processos Fork( ) Exec( )

Processos. Adão de Melo Neto

Linguagem de Programação II

PROCESSOS. Prof. Maicon A. Sartin

PROGRAMAÇÃO INSTRUÇÕES DA LINGUAGEM C

Inter-process Communication (IPC) Comunicação entre processos (1) Introdução Tubos (Pipes)

Comunicação entre Processos Canal de comunicação Arquitetura da comunicação Modelos de comunicação

SSC0640 Sistemas Operacionais I

Estruturas de entrada e saída

PROGRAMAÇÃO INSTRUÇÕES DA LINGUAGEM C

Curso de C. Procedimentos e Funções. 6/4/200901/04/09 09:42 Copyright@Arnaldo V Moura, Daniel F Ferber 1

Estrutura de um programa em linguagem C

Processos. Processo (1) Processo (2) Processo (3) Conceitos Básicos

Processos. Conceitos Básicos

Sistemas de Arquivos. Gerenciamento de Espaço em Disco

Tubos ou Pipes de Comunicação

Comunicação entre Processos Memória Compartilhada

Infra-Estrutura de Software. Introdução. (cont.)

PROCESSOS COMPONENTES DE UM PROCESSO. A execução de um processo possui vários componentes. PID e PPID

Resumo da Matéria de Linguagem de Programação. Linguagem C

Estrutura da linguagem de programação C Prof. Tiago Eugenio de Melo tiago@comunidadesol.org

INF 1007 Programação II

Linguagem C Funções definidas pelo usuário. Lógica de Programação

Introdução a Computação

SVCs para Controle de Processos no Unix (cont.) Sistemas Operacionais

Computação 2. Aula Profª. Fabiany Listas Duplamente Encadeadas

Operaçõe õ s c om o Strings Intr oduç ão a o Ponte iros o e Funçõe õ s

Programação de Sistemas

INSTITUTO SUPERIOR DE CIÊNCIAS DO TRABALHO E DA EMPRESA. Filas de mensagem

UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA INFORMÁTICA APLICADA

INF 1007 Programação II

Introdução a POO. Introdução a Linguagem C++ e POO

Registros. Técnicas de Programação. Rafael Silva Guimarães

INF 1005 Programação I

ALGORITMOS E ESRUTRA DE DADOS I. Ponteiros Passagem por Valor e Referência Alocação de Memória

Pesquisa em Memória Primária. Prof. Jonas Potros

Introdução. O que vimos. Infraestrutura de Software. (cont.) História dos Sistemas Operacionais. O que vimos 12/03/2012. Primeira geração:

Transcrição:

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 ***