Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Agosto de 2011
Sumrio
Sumrio
Processos Concorrentes I
Exerccios
Sumrio
Sumrio
Processos Concorrentes I
Exerccios
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
Sumrio
Processos Concorrentes I
Introduo
Identificao de Processos
Primitivas
Exerccios
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
Sobre os processos
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
Sobre os processos
Ateno
importante entender que cada programa , ao menos, um
processo e que cada processo possui uma srie de atributos:
PID
PPID
UID e GID
etc...
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
Atributos de um processo
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
Atributos de um processo
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
Atributos de um processo
Alm de um estado de execuo (ready, wait e exec), um processo
ocupa uma rea de memria formada basicamente por 3 partes:
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
Atributos de um processo
Text Segment O segmento de cdigo contm as instrues de
mquina geradas na compilao do programa;
User Data Segment O segmento de dados de usurio contm as
variveis utilizadas pelo programa;
System Data Segment O segmento de dados do sistema contm
os valores dos registradores da CPU quando no
estiver sendo executado por algum motivo.
Ateno !
Como as instrues so separadas dos dados, possvel
compartilhar o mesmo cdigo entre vrios programas em execuo.
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
Atributos de um processo
Um mesmo programa pode ser ativado mais de uma vez, dando
origem a vrios processos. Nesse caso, o segmento de cdigo
compartilhado entre eles, conforme mostrado na Figura abaixo:
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
Atributos de um processo
Importante
Todos os processos que existam ao mesmo tempo so
concorrentes. Eles podem funcionar completamente independentes
uns dos outros, ou ocasionalmente necessitar de sincronizao e
cooperao.
Se certas operaes podem ser logicamente executadas em
paralelo, temos os chamados processos paralelos.
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
Racing Conditions
Racing Conditions
Suponha que 3 processos compartilham o acesso a varivel A. Dois
deles fazem operaes de modificao e um imprime o valor da
varivel.
Processo 1 A = A + 5;
Processo 2 A = A + 1;
Processo 3 Imprimir A;
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
Sumrio
Processos Concorrentes I
Introduo
Identificao de Processos
Primitivas
Exerccios
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
Identificando um processo
O identificador de cada processo PID fornecido pelo Sistema
Operacional. A linguagem C tem diferentes primitivas que
permitem conhecer este nmero.
Essas primitivas esto declaradas no cabealho unistd.h.
pid_t getpid() A funo getpid() retorna o nmero do processo
em execuo;
pid_t getppid() A funo getppid() retorna o nmero do processo
pai que criou o processo em execuo.
pid_t getpgrp() Esta funo retorna o GID do processo.
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
Exemplo 1:
#include <stdio.h>
#include <unistd.h>
int main(){
printf(Eu sou o processo \%d. Meu pai o \%d. O ID do
grupo de processo o \%d.\n, getpid(),getppid(),getpgrp());
exit(0);
}
Para compilar, salve como meupid.c:
#gcc meupid.c -o meupid
#./meupid
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
Sumrio
Processos Concorrentes I
Introduo
Identificao de Processos
Primitivas
Exerccios
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
A primitiva EXEC
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
A primitiva EXEC
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
A primitiva EXEC
Ateno !
Um script, para ser interpretado no Linux, precisa iniciar com a
indicao de qual programa ser usado para a sua interpretao.
Para fazer isso, sua primeira linha deve comear com:
#!/caminho/programa
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
A primitiva SYSTEM
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
Exemplo 3:
#include <stdio.h>
#include <unistd.h>
int main{
printf("Vou chamar o programa cat para ler o contedo de /etc/issue.\n");
system("/bin/cat /etc/issue");
printf("Esta mensagem ser impressa.\n");
exit(0);
}
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
int fork(void)
Exemplo 4:
#include <stdio.h>
#include <unistd.h>
int main{
int id;
id = fork();
if(id !=0)
{
printf("Eu sou o pai e espero pelo meu filho %d.\n", id);
wait(0);
printf("Meu filho acabou de terminar...vou terminar tambm!\n");
}
else
{
printf("Eu sou o filho %d e espero 10 segundos.\n", getpid());
sleep(10);
printf("J esperei e vou embora...\n");
}
}
Prof. Joo Marcos Meirelles da Silva
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
Exemplo 5:
#include <stdio.h>
#include <unistd.h>
int main{
int pid;
printf("Meu PID %d. Vou criar um processo filho.\n", getpid());
pid = fork();
if(pid ==0) {
printf("\t\tProcesso filho criado com PID = %d.\n", getpid());
printf("Vou ficar executando indefinidamente.\n");
for(;;);
}
else {
sleep(5);
printf("O processo pai termina e deixa o filho rfo.\n");
printf("Veja se o processo filho continua rodando com o comando\n");
printf("ps\n");
}
exit(0);
}
Prof. Joo Marcos Meirelles da Silva
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
Exemplo 6:
#include
#include
#include
#include
#include
<stdio.h>
<sys/types.h>
<sys/stat.h>
<fcntl.h>
<unistd.h>
int main{
int pid, fd;
char *pidnum, c;
int i, r;
printf("Meu PID %d.\n", getpid());
printf("Vou gravar meu nmero de PID no arquivo meupid.\n");
if((fd=open("meupid",O_CREAT|O_RDWR|O_TRUNC,S_IRWXU))==-1)
{
printf("No consegui criar o arquivo meupid.\n");
exit(-1);
}
sprintf(pidnum, "%d surpresa", getpid());
if(write(fd,pidnum,15)==-1)
{
printf("No consegui escrever no arquivo.");
Prof. Joo Marcos Meirelles da Silva
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
exit(-1);
}
printf("J escrevi o nmero. Fechando o arquivo.\n");
close(fd);
printf("Vou abrir o arquivo novamente para leitura.\n");
if((fd=fopen("meupid", O_RDONLY,S_IRWXU))==-1)
{
printf("No foi possvel abrir o arquivo.\n");
exit(-1);
}
printf("Vou criar um processo filho agora.\n");
pid = fork();
if(pid ==-1)
{
perror("No foi possvel criar um processo filho.\n");
exit(-1);
}
else if (pid == 0)
{
printf("\t\tSou o processo filho. Meu PID = %d.\n", getpid());
printf("\t\tVou ler o arquivo que j estava aberto pelo processo pai antes.\n")
printf("\t\tda minha criao e que eu herdei.\n");
for(i=1; i<= 5; i++)
{
Prof. Joo Marcos Meirelles da Silva
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
if(read(fd,&c,1)==-1)
{
printf("No consegui ler o arquivo...");
exit(-1);
}
printf("O nmero que foi lido no arquivo %c.\n", c);
}
printf("\t\tFechando o arquivo e terminando minha execuo...\n");
close(fd);
exit(1);
}
else /* aqui comeam as instrues do processo pai. */
{
wait();
printf("O processo filho criado tinha o PID nmero %d.\n", pid);
printf("Vou ler o arquivo meupid.\n");
while((r=read(fd,&c,1)) != 0)
{
if(r == -1)
{
printf("Impossvel ler o arquivo.");
exit(-1);
}
printf("Consegui ler => %c\n", c);
Prof. Joo Marcos Meirelles da Silva
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
}
printf("Meu filho leu o nmero do PID no arquivo e mexeu no meu ponteiro.\n");
printf("Terminando minha executando.\n");
close(fd);
}
exit(0);
}
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
pid_t wait(int *status) e pid_t waitpid(pid_t pid, int *status, int options)
Exemplo 7:
#include
#include
#include
#include
#include
<signal.h>
<stdio.h>
<unistd.h>
<sys/types.h>
<sys/wait.h>
int main{
int pid;
printf("\nMeu PID %d e meu GID %d. Irei criar um processo filho.\n",
getpid(), getpgrp());
if(fork() == 0) /* Instrues do processo filho. */
{
printf("\t\tProcesso filho criado. Meu PID %d e meu GID %d.\n",
getpid(), getpgrp());
sleep(4);
printf("Vou sair com cdigo 7.\n\n");
exit(7);
}
else /* Instrues do processo pai. */
Prof. Joo Marcos Meirelles da Silva
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
{
int ret1, status1;
printf("Sou o processo pai. Estou esperando o processo filho.\n");
ret1 = wait(&status1);
printf("O processo filho que terminou foi o de de PID = %d.\n", ret1);
printf("Ele terminou com o parmetro de exit() = %d.\n", (status1>>8));
}
exit(0);
}
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
Processos Zombie
possvel que um determinado processo filho termine por algum
motivo inesperado, se torne um processo zombie (ou defunct). Os
processos zombie no podem ser terminados com o comando kill,
porque eles j no existem mais. preciso terminar o processo pai.
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
(zombie.c)
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
int main{
int pid;
printf("Meu PID %d e vou criar um processo filho.\n", getpid());
pid = fork();
if(pid == 0) /* Aqui comeam as instrues do processo filho. */
{
printf("\t\tMeu PID %d e fui criado por %d.\n", getpid(), getppid());
printf("\t\tVerifique os processos em execuo com o comando ps.\n");
sleep(10);
printf("Processo filho terminado normalmente.\n");
exit(0);
}
else /* Aqui comeam as instrues do processo pai. */
{ for(;;);
}
}
Prof. Joo Marcos Meirelles da Silva
Processos Concorrentes I
Exerccios
Introduo
Identificao de Processos
Primitivas
Processos Concorrentes I
Exerccios
Atributos de Processos
Identificao de Processos
Sumrio
Processos Concorrentes I
Exerccios
Atributos de Processos
Identificao de Processos
Processos Concorrentes I
Exerccios
Atributos de Processos
Identificao de Processos
Exerccio 1:
Processos Concorrentes I
Exerccios
Atributos de Processos
Identificao de Processos
Sumrio
Processos Concorrentes I
Exerccios
Atributos de Processos
Identificao de Processos
Processos Concorrentes I
Exerccios
Atributos de Processos
Identificao de Processos
Exerccio 2: