Chamadas de sistema

Sistema Fork Call Linux

Sistema Fork Call Linux

Chamada do sistema Fork

A chamada de sistema fork é usada para criar novos processos. O processo recém-criado é o processo filho. O processo que chama fork e cria um novo processo é o processo pai. Os processos filho e pai são executados simultaneamente.

Mas os processos filho e pai residem em diferentes espaços de memória. Esses espaços de memória têm o mesmo conteúdo e qualquer operação realizada por um processo não afetará o outro processo.

Quando os processos filhos são criados; agora ambos os processos terão o mesmo contador de programa (PC), então ambos os processos apontarão para a mesma próxima instrução. Os arquivos abertos pelo processo pai serão os mesmos para o processo filho.

O processo filho é exatamente igual ao pai, mas há diferenças nos IDs dos processos:

  1. O ID de processo do processo filho é um ID de processo único que é diferente dos IDs de todos os outros processos existentes.
  2. O ID do processo pai será o mesmo que o ID do processo do pai da criança.

Propriedades do processo filho

A seguir estão algumas das propriedades que um processo filho contém:

  1. Os contadores de CPU e as utilizações de recursos são inicializados para zerar.
  2. Quando o processo pai é encerrado, os processos filhos não recebem nenhum sinal porque o atributo PR_SET_PDEATHSIG em prctl () é redefinido.
  3. O thread usado para chamar fork () cria o processo filho. Portanto, o endereço do processo filho será o mesmo do pai.
  4. O descritor de arquivo do processo pai é herdado pelo processo filho. Por exemplo, o deslocamento do arquivo ou status dos sinalizadores e os atributos de I / O serão compartilhados entre os descritores de arquivo dos processos filho e pai. Assim, o descritor de arquivo da classe pai irá se referir ao mesmo descritor de arquivo da classe filha.
  5. Os descritores da fila de mensagens abertas do processo pai são herdados pelo processo filho. Por exemplo, se um descritor de arquivo contém uma mensagem no processo pai, a mesma mensagem estará presente no descritor de arquivo correspondente do processo filho. Portanto, podemos dizer que os valores dos sinalizadores desses descritores de arquivo são os mesmos.
  6. Da mesma forma, os fluxos de diretório aberto serão herdados pelos processos filhos.
  7. O valor da folga do temporizador padrão da classe filha é o mesmo que o valor da folga do temporizador atual da classe pai.

Propriedades que não são herdadas pelo processo filho

A seguir estão algumas das propriedades que não são herdadas por um processo filho:

  1. Travas de memória
  2. O sinal pendente de uma classe filha está vazio.
  3. Processar bloqueios de registros associados (fcntl ())
  4. Operações de E / S assíncronas e conteúdos de E / S.
  5. Notificações de mudança de diretório.
  6. Timers como alarm (), setitimer () não são herdados pela classe filha.

fork () em C

Não há argumentos em fork () e o tipo de retorno de fork () é inteiro. Você deve incluir os seguintes arquivos de cabeçalho quando fork () é usado:

#incluir
#incluir
#incluir

Ao trabalhar com garfo (), pode ser usado para tipo pid_t para IDs de processos, pois pid_t é definido em .

O arquivo de cabeçalho é onde fork () é definido, então você deve incluí-lo em seu programa para usar fork ().

O tipo de retorno é definido em e a chamada fork () é definida em . Portanto, você precisa incluir ambos em seu programa para usar a chamada de sistema fork ().

Sintaxe de fork ()

A sintaxe da chamada do sistema fork () no Linux, Ubuntu é a seguinte:

pid_t fork (vazio);

Na sintaxe, o tipo de retorno é pid_t. Quando o processo filho é criado com sucesso, o PID do processo filho é retornado no processo pai e 0 será retornado ao próprio processo filho.

Se houver algum erro, -1 é retornado ao processo pai e o processo filho não é criado.

Nenhum argumento é passado para fork (). 

Exemplo 1: Chamando fork ()

Considere o exemplo a seguir, no qual usamos a chamada de sistema fork () para criar um novo processo filho:

CÓDIGO:

#incluir
#incluir
#incluir
int main ()

garfo();
printf ("Usando a chamada do sistema fork () \ n");
return 0;

RESULTADO:

Usando a chamada de sistema fork ()
Usando a chamada de sistema fork ()

Neste programa, usamos fork (), isso criará um novo processo filho. Quando o processo filho é criado, tanto o processo pai quanto o processo filho apontam para a próxima instrução (mesmo contador de programa). Desta forma, as instruções restantes ou declarações C serão executadas o número total de vezes do processo, ou seja 2n vezes, onde n é o número de chamadas de sistema fork ().

Então, quando a chamada fork () é usada uma vez como acima (21 = 2) teremos nossa saída 2 vezes.

Aqui, quando a chamada de sistema fork () é usada, a estrutura interna será semelhante a:

Considere o seguinte caso em que fork () é usado 4 vezes:

CÓDIGO:

#incluir
#incluir
#incluir
int main ()

garfo();
garfo();
garfo();
garfo();
printf ("Usando a chamada do sistema fork ()");
return 0;

Resultado:

Usando a chamada do sistema fork () Usando a chamada do sistema fork () Usando a chamada do sistema fork () Usando a chamada do sistema fork () Usando a chamada do sistema fork () Usando a chamada do sistema fork () Usando a chamada do sistema fork () Usando a chamada do sistema fork () () chamada do sistema Usando a chamada do sistema fork () Usando a chamada do sistema fork () Usando a chamada do sistema fork () Usando a chamada do sistema fork () Usando a chamada do sistema fork () Usando a chamada do sistema fork () Usando a chamada do sistema fork () 

Agora, o número total de processos criados são 24 = 16 e temos nossa instrução de impressão executada 16 vezes.

Exemplo 2: Testando se fork () foi bem-sucedido

No exemplo a seguir, usamos a construção de tomada de decisão para testar o valor (int) retornado por fork (). E as mensagens correspondentes são exibidas:

CÓDIGO:

#incluir
#incluir
#incluir
int main ()

pid_t p;
p = garfo ();
if (p == - 1)

printf ("Ocorreu um erro ao chamar fork ()");

if (p == 0)

printf ("Estamos no processo filho");

senão

printf ("Estamos no processo pai");

return 0;

RESULTADO:

Estamos no processo pai
Estamos no processo filho

No exemplo acima, usamos o tipo pid_t que armazenará o valor de retorno de fork (). fork () é chamado online:

p = garfo ();

Portanto, o valor inteiro retornado por fork () é armazenado em pe então p é comparado para verificar se nossa chamada a fork () foi bem sucedida.

Quando a chamada fork () é usada e o filho é criado com sucesso, o id do processo filho será retornado ao processo pai e 0 será retornado ao processo filho.O ID do processo filho no processo pai não será o mesmo que o ID do processo filho no próprio processo filho. No processo filho, o ID do processo filho será 0.

Com este tutorial, você pode ver como começar com a chamada do sistema fork no linux.

Adicione gestos do mouse ao Windows 10 usando essas ferramentas gratuitas
Nos últimos anos, os computadores e sistemas operacionais evoluíram muito. Houve um tempo em que os usuários tinham que usar comandos para navegar pel...
Controle e gerencie o movimento do mouse entre vários monitores no Windows 10
Gerenciador de mouse com tela dupla permite que você controle e configure o movimento do mouse entre vários monitores, diminuindo seus movimentos pert...
WinMouse permite que você personalize e melhore o movimento do ponteiro do mouse no PC com Windows
Se você quiser melhorar as funções padrão do ponteiro do mouse, use um freeware WinMouse. Ele adiciona mais recursos para ajudá-lo a obter o máximo do...