GithubHelp home page GithubHelp logo

bieanimaton / codigos_c_processos_e_filhos_tradicionais_linux Goto Github PK

View Code? Open in Web Editor NEW
0.0 1.0 0.0 8 KB

Códigos feitos em C na matéria de Sistemas Operacionais II para criar e manipular processos tradicionais e filhos tradicionais no Linux (distribuição usada: Slax)

C 100.00%
fork getpid waitpid getppid pidt exit sys systypes types

codigos_c_processos_e_filhos_tradicionais_linux's Introduction

Criando processos e filhos

Códigos feitos em C para criar e manipular processos tradicionais e filhos tradicionais no Linux (distro usada: Slax)

Observações adicionais:

Para compilar: cc progN.c -o progN
Para executar: ./progN

Comando para criar processo filho através do Gerenciador de Processos.

...
fork();
...

Caso seja colocado dentro de um laço, vai criar filhos até o computador travar (consumir toda a memória).... então, nem pensar >︿<.

Criando variável "var" do tipo "pid_t" para armazenar o valor retornado do "fork()".

pid_t var;
...
var = fork();
...

A "var" do filho copia "var" do pai, ou seja, "var" do filho é igual a 0, PORÉM, "var" do pai recebe o "PID" do processo filho e é alterado

  • "var" do filho = 0
  • "var" do pai = 18463 (PID do filho - número escolhido aleatoriamente)

Criar condição para apenas o filho executar.

pid_t var;
...
var = fork();
if (var == 0) {
  printf("Sou o processo filho");
  sleep(2);
  ...
}
sleep(3);
printf("Sou o processo pai");
...

Caso não coloquemos nenhum comando de finalização no bloco do filho, o próprio filho "escaprá" de seu bloco e executará o printf() de fora, ou seja, a linha do pai.

Ao rodarmos o exemplo, a frase "Sou o processo pai" é impressa duas vezes (uma depois de 3 segundos - pelo pai - e a outra depois da finalização do programa - pelo filho -).

Comando para finalização do processo filho.

pid_t var;
...
var = fork();
if (var == 0) {
  printf("Sou o processo filho");
  sleep(2);
  ...
  exit(0);
}
sleep(3);
printf("Sou o processo pai");
...

O comando exit(0); é mais aconselhado para esta tarefa.

Imprimindo identificadores do próprio processo e do processo pai.

pid_t var;
...
var = fork();
if (var == 0) {
	printf("O meu PID e %d.\n",getpid());
	printf("O PID do meu PAI e %d.\n", getppid());
  ..
  exit(0);
}
sleep(3);
printf("Sou o processo pai");
...
  • getpid(): retorna o PID (identificador) do processo
  • getppid(): retorna o PID (identificador) do pai (parent) do processo

Usar "sleep(N);" não é recomendado - usar "waitpid(x, y, 0);.

pid_t var;
int estado;
...
var = fork();
if (var == 0) {
	printf("O meu PID e %d.\n",getpid());
	printf("O PID do meu PAI e %d.\n", getppid());
  ..
  exit(0);
}
waitpid(var, estado, 0)
printf("Sou o processo pai");
...

O comando waitpid() segue a seguinte lógica: quando o "estado" de "var" for 0, encerrar o filho.

Variáveis não são compartilhadas.

Como estamos trabalhando com processos TRADICIONAIS, precisamos lembrar que o filho é uma copia por completo do pai, mas não compartilham nada entre si.

pid_t filho1, filho2;
int estado, valor = 10;

filho1 = fork();
if (filho1 == 0) {
   valor = valor + 5;
   printf("Processo-Filho 1: O valor de VALOR e %d.\n", valor);
   sleep(5);
   printf("Processo-Filho 1: Encerrando a execucao.\n");
   exit(0);
}

filho2 = fork();
if (filho2 == 0) {
   valor = valor - 2;
   printf("Processo-Filho 2: O valor de VALOR e %d.\n", valor);
   sleep(5);
   printf("Processo-Filho 2: Encerrando a execucao.\n");
   exit(0);
}

waitpid(filho1,estado,0);
waitpid(filho2,estado,0);

printf("Sou o processo pai");
printf("Processo-Pai: O valor de VALOR e %d.\n",valor);
...

No exemplo acima, como os dados não são compartilhados, ou seja, o pai e cada filho têm o seu próprio "valor", a saída na tela ficará da seguinte forma:

  • "filho1" vai dizer que seu "valor" é 15,
  • "filho2" vai dizer que seu "valor" é 8 e
  • "pai" vai dizer que seu "valor" é 10

codigos_c_processos_e_filhos_tradicionais_linux's People

Contributors

bieanimaton avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.