Você está na página 1de 7

TRABALHO DA DISCIPLINA DE SISTEMAS OPERACIONAIS

CHAMADAS DE SISTEMA SYSTEM CALLS

Grupo: Aline Antunes Dias 200720327 Eduardo de O. Rodrigues 200820365 Luis Otvio Avelar - 200820363

Julho/2011

EXERCCIO 1: Segundo a manpage da system call kill, ao se executar um kill (pid, sig): If pid equals 0, then sig is sent to every process in the process group of the current process. Muito bem: o que , para que serve e como se manipula um process group? Resposta: O que : Consiste no processo pai(e ancestrais), irmos e filhos(descendentes mais distantes), segundo TANENBAUM(2010). Cada processo pertence a um grupo de processos, que identificado pelo ID do grupo de processos. Todos os processos do grupo so tratados como uma nica entidade. Para que serve: O kernel usa este mecanismo para tomar certas aes sobre todos processos em um grupo. So usados para controlar a distribuio de sinais. Um sinal direcionado para um grupo de processo entregue individualmente a todos os processos que so membros do grupo. Grupos ou sesses so tambm herdadas pelos filhos de um processo. Grupos de processos no esto autorizados a migrar de uma sesso para outra, e um processo s pode criar grupos de processos novos pertencentes sesso a que ele mesmo pertence. Processos no esto autorizados a juntar-se a grupos de processos que no esto na mesma sesso que eles esto. So usados pelo C Shell para controlar a operao de vrias tarefas. H tambm o conceito de sesso: Uma sesso um conjunto de grupos de processos Cada sesso pode ter um nico terminal controlador, no mximo 1 grupo de processos de foreground, n grupos de processos de background. Como se manipula: A funo getpgrp() retorna o nmero do grupo do processo chamador. A primitiva setsid()obtm um novo grupo para o processo. Ela coloca o processo em um novo grupo e sesso, tornando-o independente do seu terminal de controle (setpgrp uma alternativa para isso). usada para passar um processo de foreground em background. getsid() retorna a id do grupo de processos.

EXERCCIO 2:
#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<signal.h> #include<sys/types.h> #include<time.h> #define READ 0 #define WRITE 1 #define PAI (filho1 !=0 && filho2 !=0 && filho3 !=0) #define FILHO1 (filho1 == 0) #define FILHO2 (filho1 != 0 && filho2 == 0) #define FILHO3 (filho1 != 0 && filho2 != 0 && filho3 == 0) #define bytes 6 * sizeof(int) //nmero de bytes das funes read e write int n,filho1, filho2, filho3,fd1[2],fd2[2],fd3[2]; //Funo que usada com SIGCHLD void zombie(){ printf("\n %d - Matou um Filho \n",getpid()); } //Funo que usada com SIGPIPE void tubo_fechado(){ printf("\n Impossvel escrever em um pipe fechado. \n O programa sera ENCERRADO!\n"); kill(filho1,SIGTERM); kill(filho2,SIGTERM); kill(filho3,SIGTERM); kill(getpid(),SIGTERM); } //Funo que usada com SIGUSR1 void gera_num(){ srand(time(NULL)); int k, num[6]; for (k=0; k<= 5; k++){ num[k] = (rand() % 60) ; } if(FILHO1){ close( fd1[READ] ); write( fd1[WRITE], &num[0], bytes); } if(FILHO2){ close( fd2[READ] ); write( fd2[WRITE], &num[0], bytes); } if(FILHO3){ close( fd3[READ] ); write( fd3[WRITE], &num[0], bytes); } }

//PRINCIPAL int main(int a, char *argv[]) { int i,line1[6],line2[6],line3[6], media[6]; if(a == 1){ n = 1; }else{ n = atoi(argv[1]); } valer 1. signal(SIGUSR1, gera_num); signal(SIGCHLD,zombie); signal(SIGPIPE,tubo_fechado); printf(" \nPAI %d\n",getpid()); if ( pipe(fd1)<0 ) { fprintf(stderr,"Erro no tubo 1\n");_exit(1); } if ( pipe(fd2)<0 ) { fprintf(stderr,"Erro no tubo 2\n");_exit(1); } if ( pipe(fd3)<0 ) { fprintf(stderr,"Erro no tubo 3\n");_exit(1); } if( n == 4){ close(fd1[READ]); close(fd2[READ]); close(fd3[READ]); } if ( (filho1=fork()) < 0 ) { fprintf(stderr,"Erro no fork 1\n"); _exit(1); } if(filho1 != 0){ if ( (filho2=fork()) < 0 ){ fprintf(stderr,"Erro no fork 2\n"); _exit(1); } if(filho2 != 0){ if ( (filho3=fork()) < 0 ) { fprintf(stderr,"Erro no fork 3\n"); _exit(1); } } } if (PAI) { /* processo ascendente */ int j; close( fd1[WRITE] ); close( fd2[WRITE] ); close( fd3[WRITE] ); for(i=1;i<=n;i++){ j=0; sleep(1); kill(filho1,SIGUSR1); sleep(1); kill(filho2,SIGUSR1); sleep(1); //Ento, tempo menor que 1s continua sempre a mesma semente. kill(filho3,SIGUSR1); read(fd3[READ],line3,bytes); // Recebe o parmetro externo que conta as iteraes a realizar. // Se no for digitado argumento para quantidade de iteraes n

read(fd2[READ],line2,bytes); read(fd1[READ],line1,bytes); printf("\n == MEGASENA == Sorteio %d ==>",i); for(j=0;j < 6;j++){ printf(" %d ",(line1[j]+line2[j]+line3[j])/3 ); } printf("\n"); } }else{ while(1){}; }// While pega filho if(PAI) { kill(filho1,SIGTERM); sleep(1); kill(filho2,SIGTERM); sleep(1); kill(filho3,SIGTERM); sleep(1); }else{ printf("Filho escapando"); } }

//O exerc_2.c est em anexo a esta mensagem.

EXERCCIO 3:
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <pthread.h> #include <sys/types.h> #include <unistd.h> #include <sys/mman.h> #include <sys/stat.h> #include <fcntl.h> #include <ctype.h> int main(){ int i,pid, j; char buf[100]; char *buf2; int file; int fd[2]; pipe(fd); pid=fork(); if (pid == 0){ close(fd[1]); read(fd[0],buf,100); for(i=0;i<100;i++) printf("%c",buf[i]); printf("\n"); }else{ close(fd[0]); file = open ("exemplo.txt",O_RDONLY); buf2= mmap(NULL,100,PROT_WRITE,MAP_PRIVATE,file,0); j = 0; while(buf2[j]!='\0'){ if( (buf2[j]>96 && buf2[j]<123) )buf2[j] = buf2[j]-32; j++; } write(fd[1],buf2,100); } } //O exerc_3.c est em anexo a esta mensagem.

EXERCCIO 4:
#include <stdio.h> #include <sys/sysinfo.h> int main(void){ struct sysinfo info; struct info { long uptime; /* Seconds since boot */ unsigned long loads[3]; /* 1, 5, and 15 minute load averages */ unsigned long totalram; /* Total usable main memory size */ unsigned long freeram; /* Available memory size */ unsigned long sharedram; /* Amount of shared memory */ unsigned long bufferram; /* Memory used by buffers */ unsigned long totalswap; /* Total swap space size */ long freeswap; /* swap space still available */ unsigned short procs; /* Number of current processes */ unsigned long totalhigh; /* Total high memory size */ long freehigh; /* Available high memory size */ unsigned int mem_unit; /* Memory unit size in bytes */ char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding for libc5 */ }; sysinfo(&info); printf("Informacoes do sistema\n\n"); printf("Memoria livre: %ld\n", info.freeram); printf("Swap livre: %ld\n", info.freeswap); printf("Numero de processos: %hi\n", info.procs); return 0; } //O exerc_4.c est em anexo a esta mensagem.

Você também pode gostar