Jantar filósofos
Por: danieltdf • 2/11/2015 • Relatório de pesquisa • 947 Palavras (4 Páginas) • 383 Visualizações
Relatório de Atividades de Laboratório
Sistemas de Computação
Lab01 – CRIAÇÃO DE PROCESSOS
Daniel Teixeira de Farias matrícula: 0321025
17/12/2012
Sumário
Objetivos
Metodologia
Resultados
Analise
Conclusão
Referências.....................................................................................................................................5
Objetivos
O principal objetivo da prática consistiu da análise e familiarização das chamadas de sistema do LINUX para criação de processos e sub-processos. O comportamento e a forma como eles interagem com outras chamadas de sistema também foi analisada de forma a compreender melhor o comportamento do processo pai e filho.
Metodologia
Para a simulação foi utilizada a linguagem de programação C, onde os comandos analisados foram o fork() , execv() e a função system(). A prática abordou a criação de processos em quatro estágios, divididos em questões. A primeira questão trata da criação dos processos pai e filho, verificando seus id’s através da função getpid() e do comando ps aux no terminal.
A segunda questão era similar a primeira, verificando agora que o processo pai e o filho possuem o mesmo mapa de memória, sendo feita através de uma variável declarada antes do comando fork() . A terceira questão trata da ação conjunta das funções fork() e execv(), onde espera-se que a função sobrescreva o processo que a chamou.
Ao final, é utilizada a função system() para executar algum dos três programas feitos anteriormente e observar que ela não sobrescreve o processo que a chamou, diferentemente da função execv().
Resultados
Segue abaixo os códigos utilizados na prática. Observe pelos comentários quais comandos foram utilizados nas respectivas questões.
#include
#include
#include
int main(void){
int i, ret;
char c;
pid_t pid;
char *cmd[] = {"kill", "-9", (char*)pid};
if ((pid = fork()) < 0) {
perror("fork");
exit(1);
}
if (pid == 0) {
while(1){
printf("FILHO - PID: %d\n", pid); //comando utilizado na 1q
ret = execv("/bin/kill", cmd); //comando utilizado na 3q
}
}
else {
while(1){
printf ("PAI - PID: %d\n", pid);
system("ps aux | grep fork2"); // comando utilizado na 4q
}
}
write(1, "\n", 1);
exit(0);
}
Analise
Observou-se ainda que, embora os dois processos possuam um mapa de memória idêntico após a chamada a fork() , eles evoluem de forma independente, o que significa que o filho possui uma própria cópia das variáveis do processo pai.
...