Este pdf contém o código, em linguagem C, de 6 ficheiros. Os 3 primeiros ficheiros correspondem à solução do exercício 3 do capítulo 4 (solução para o problema do buffer limitado utilizando apenas 2 semáforos). O 1º ficheiro cria e liberta os recursos (semáforos e memória partilhada). O 2º ficheiro armazena informação no buffer limitado O 3º ficheiro retira informação do buffer. Os 3 últimos ficheiros são também uma solução para o problema do buffer limitado mas utilizando 3 semáforos. O 1º ficheiro cria e liberta os recursos (semáforos e memória partilhada). O 2º ficheiro armazena informação no buffer limitado O 3º ficheiro retira informação do buffer.
#include <stdio.h> #include <sys/ipc.h> #include <sys/shm.h> #include <sys/sem.h> #define SHM_KEY1 0x00007570 #define SHM_KEY2 0x00007566 #define SHM_KEY3 0x00007567 #define SHM_KEY4 0x00007568 #define SHM_KEY5 0x00007569 #define SEM_KEY 0x00007570 main(){ int semid, shmid_buffer, shmid_flag,shmid_turn,shmid_in,shmid_out, *shmaddr_buffer, *shmaddr_flag,*shmaddr_turn,*shmaddr_in,*shmaddr_out, i; union semun {int val; arg; char resp[10]; //criar uma zona de memória partilhada, para servir de buffer de //10 inteiros if((shmid_buffer=shmget(shm_key1,10*sizeof(int),0677 IPC_CREAT IPC_EXC L))==-1){ if((shmaddr_buffer = (int*)shmat(shmid_buffer, NULL,0))==(int*)-1){ //variáveis partilhadas usadas para controlar o acesso à secção //crítica //criar uma zona de memória partilhada, para armazenar o valor de //2 flags ==-1){ -1){ if((shmid_flag=shmget(shm_key2,2*sizeof(int),0677 IPC_CREAT IPC_EXCL)) if((shmaddr_flag = (int*)shmat(shmid_flag, NULL,0))==(int*)-1){ //inicialização das flags a falso for(i=0;i<=1;i++) *(shmaddr_flag+i)=0; //criar uma zona de memória partilhada, para armazenar o valor de //turn if((shmid_turn=shmget(shm_key3,sizeof(int),0677 IPC_CREAT IPC_EXCL))== if((shmaddr_turn = (int*)shmat(shmid_turn, NULL,0))==(int*)-1){
shmctl(shmid_turn, IPC_RMID, NULL); *shmaddr_turn=0; ){ 1){ //criar uma zona de memória partilhada, para armazenar o valor de //in (posição onde será colocado o novo item produzido) if((shmid_in=shmget(shm_key4,sizeof(int),0677 IPC_CREAT IPC_EXCL))==-1 shmctl(shmid_turn, IPC_RMID, NULL); if((shmaddr_in = (int*)shmat(shmid_in, NULL,0))==(int*)-1){ shmctl(shmid_turn, IPC_RMID, NULL); shmctl(shmid_in, IPC_RMID, NULL); *shmaddr_in=0; //criar uma zona de memória partilhada, para armazenar o valor de //out (posição de onde será retirado o próximo item a ser //consumido) if((shmid_out=shmget(shm_key5,sizeof(int),0677 IPC_CREAT IPC_EXCL))==- shmctl(shmid_turn, IPC_RMID, NULL); shmctl(shmid_in, IPC_RMID, NULL); if((shmaddr_out = (int*)shmat(shmid_out, NULL,0))==(int*)-1){ shmctl(shmid_turn, IPC_RMID, NULL); shmctl(shmid_in, IPC_RMID, NULL); shmctl(shmid_out, IPC_RMID, NULL); *shmaddr_out=0; if((semid=semget(sem_key, 2, 0700 IPC_CREAT IPC_EXCL))==-1){ perror("semget"); shmctl(shmid_turn, IPC_RMID, NULL); shmctl(shmid_in, IPC_RMID, NULL); shmctl(shmid_out, IPC_RMID, NULL); arg.val =0; if(semctl(semid,0,setval,arg)==-1){ perror("semctl");
shmctl(shmid_turn, IPC_RMID, NULL); shmctl(shmid_in, IPC_RMID, NULL); shmctl(shmid_out, IPC_RMID, NULL); semctl(semid, 0, IPC_RMID, NULL); arg.val =10; if(semctl(semid,1,setval,arg)==-1){ perror("semctl"); shmctl(shmid_turn, IPC_RMID, NULL); shmctl(shmid_in, IPC_RMID, NULL); shmctl(shmid_out, IPC_RMID, NULL); semctl(semid, 0, IPC_RMID, NULL); do{ printf("quer libertar os recursos? (S/N)\n"); scanf("%s",resp); while((resp[0]!='s')&&(resp[0]!='s')); shmctl(shmid_turn, IPC_RMID, NULL); shmctl(shmid_in, IPC_RMID, NULL); shmctl(shmid_out, IPC_RMID, NULL); semctl(semid, 0, IPC_RMID, NULL);
#include <stdio.h> #include <sys/ipc.h> #include <sys/shm.h> #include <sys/sem.h> #define SHM_KEY1 0x00007570 #define SHM_KEY2 0x00007566 #define SHM_KEY3 0x00007567 #define SHM_KEY4 0x00007568 #define SHM_KEY5 0x00007569 #define SEM_KEY 0x00007570 main(){ int semid, shmid_buffer,shmid_flag,shmid_turn,shmid_in, *shmaddr_buffer, *shmaddr_flag, *shmaddr_turn, *shmaddr_in, i; struct sembuf sop; if ((shmid_buffer=shmget (SHM_KEY1, 10*sizeof(int), 0))==-1){ if((shmaddr_buffer = (int*)shmat(shmid_buffer, NULL,0))==(int*)-1){ if ((shmid_flag=shmget (SHM_KEY2, 2*sizeof(int), 0))==-1){ if((shmaddr_flag = (int*)shmat(shmid_flag, NULL,0))==(int*)-1){ if ((shmid_turn=shmget (SHM_KEY3, sizeof(int), 0))==-1){ if((shmaddr_turn = (int*)shmat(shmid_turn, NULL,0))==(int*)-1){ if ((shmid_in=shmget (SHM_KEY4, sizeof(int), 0))==-1){ if((shmaddr_in = (int*)shmat(shmid_in, NULL,0))==(int*)-1){ if((semid=semget(sem_key, 1, 0))==-1){ perror("semget"); sop.sem_num=1; sop.sem_op=-1;
semop(semid, &sop, 1); shmaddr_flag[0]=1; *shmaddr_turn=1; while((shmaddr_flag[1]) && (*shmaddr_turn==1)); printf("introduza o valor que quer armazenar no buffer\n"); scanf("%d",&shmaddr_buffer[*shmaddr_in]); *shmaddr_in=(*shmaddr_in+1)%10; shmaddr_flag[0]=0; sop.sem_num=0; sop.sem_op=1; semop(semid, &sop, 1);
#include <stdio.h> #include <sys/ipc.h> #include <sys/shm.h> #include <sys/sem.h> #define SHM_KEY1 0x00007570 #define SHM_KEY2 0x00007566 #define SHM_KEY3 0x00007567 #define SHM_KEY4 0x00007568 #define SHM_KEY5 0x00007569 #define SEM_KEY 0x00007570 main(){ int semid, shmid_buffer,shmid_flag,shmid_turn,shmid_out, *shmaddr_buffer, *shmaddr_flag, *shmaddr_turn,*shmaddr_out, i; struct sembuf sop; if ((shmid_buffer=shmget (SHM_KEY1, 10*sizeof(int), 0))==-1){ if((shmaddr_buffer = (int*)shmat(shmid_buffer, NULL,0))==(int*)-1){ if ((shmid_flag=shmget (SHM_KEY2, 2*sizeof(int), 0))==-1){ if((shmaddr_flag = (int*)shmat(shmid_flag, NULL,0))==(int*)-1){ if ((shmid_turn=shmget (SHM_KEY3, sizeof(int), 0))==-1){ if((shmaddr_turn = (int*)shmat(shmid_turn, NULL,0))==(int*)-1){ if ((shmid_out=shmget (SHM_KEY5, sizeof(int), 0))==-1){ if((shmaddr_out = (int*)shmat(shmid_out, NULL,0))==(int*)-1){ if((semid=semget(sem_key, 1, 0))==-1){ perror("semget");
sop.sem_num=0; sop.sem_op=-1; semop(semid, &sop, 1); shmaddr_flag[1]=1; *shmaddr_turn=0; while((shmaddr_flag[0]) && (*shmaddr_turn==0)); printf("o elemento retirado do buffer tem o valor %d\n",shmaddr_buffer [*shmaddr_out]); *shmaddr_out=(*shmaddr_out+1)%10; shmaddr_flag[1]=0; sop.sem_num=1; sop.sem_op=1; semop(semid, &sop, 1);
#include<stdio.h> #include<sys/ipc.h> #include<sys/shm.h> #include<sys/sem.h> #define FULL 0 #define EMPTY 1 #define MUTEX 2 #define SHM_KEY1 0x00007580 #define SHM_KEY2 0x00007581 #define SHM_KEY3 0x00007582 #define SEM_KEY 0x00007580 main(){ int shmid_buffer,shmid_in,shmid_out,semid,*shmaddr_buffer,*shmaddr_in, *shmaddr_out; union semun {int val; arg; char resp[10]; if((shmid_buffer=shmget(shm_key1,10*sizeof(int),0600 IPC_CREAT IPC_EXC L))==-1){ if((shmaddr_buffer=(int*)shmat(shmid_buffer,null,0))==(int*)-1){ exit(2); ){ if((shmid_in=shmget(shm_key2,sizeof(int),0600 IPC_CREAT IPC_EXCL))==-1 exit(3); if((shmaddr_in=(int*)shmat(shmid_in,null,0))==(int*)-1){ exit(4); 1){ if((shmid_out=shmget(shm_key3,sizeof(int),0600 IPC_CREAT IPC_EXCL))==- exit(5); if((shmaddr_out=(int*)shmat(shmid_out,null,0))==(int*)-1){ shmctl(shmid_out,ipc_rmid,null); exit(6);
*shmaddr_in=0; *shmaddr_out=0; if ((semid=semget(sem_key,3,0700 IPC_CREAT IPC_EXCL))==-1) { perror("semget"); shmctl(shmid_out,ipc_rmid,null); exit(7); arg.val=0; if ((semctl(semid,full,setval,arg))==-1){ perror("semctl"); shmctl(shmid_out,ipc_rmid,null); semctl(semid,0,ipc_rmid,null); exit(8); arg.val=10; if ((semctl(semid,empty,setval,arg))==-1){ perror("semctl"); shmctl(shmid_out,ipc_rmid,null); semctl(semid,0,ipc_rmid,null); exit(9); arg.val=1; if ((semctl(semid,mutex,setval,arg))==-1){ perror("semctl"); shmctl(shmid_out,ipc_rmid,null); semctl(semid,0,ipc_rmid,null); exit(10); do{ printf("quer libertar os recursos? (S/N)\n"); scanf("%s",resp); while((resp[0]!='s')&&(resp[0]!='s')); shmctl(shmid_out,ipc_rmid,null); semctl(semid,0,ipc_rmid,null);
#include<stdio.h> #include<sys/ipc.h> #include<sys/shm.h> #include<sys/sem.h> #define FULL 0 #define EMPTY 1 #define MUTEX 2 #define SHM_KEY1 0x00007580 #define SHM_KEY3 0x00007582 #define SEM_KEY 0x00007580 main(){ int shmid_buffer,shmid_in,semid,i,*shmaddr_buffer,*shmaddr_in=0, val; struct sembuf sop; if((shmid_buffer=shmget(shm_key1,10*sizeof(int),0))==-1){ if((shmaddr_buffer=(int*)shmat(shmid_buffer,null,0))==(int*)-1){ exit(2); if((shmid_in=shmget(shm_key3,sizeof(int),0))==-1){ exit(3); if((shmaddr_in=(int*)shmat(shmid_in,null,0))==(int*)-1){ exit(4); if ((semid=semget(sem_key,3,0))==-1) { perror("semget"); exit(5); sop.sem_num=empty; sop.sem_op=-1; printf("introduza o valor a armazenar: \n"); scanf("%d",&val); sop.sem_num=mutex; sop.sem_op=-1; shmaddr_buffer[*shmaddr_in]= val; *shmaddr_in=(*shmaddr_in+1)%10; sop.sem_num=mutex;
sop.sem_op=1; sop.sem_num=full; sop.sem_op=1;
#include<stdio.h> #include<sys/ipc.h> #include<sys/shm.h> #include<sys/sem.h> #define FULL 0 #define EMPTY 1 #define MUTEX 2 #define SHM_KEY1 0x00007580 #define SHM_KEY2 0x00007581 #define SEM_KEY 0x00007580 main(){ int shmid_buffer,shmid_out,semid,*shmaddr_buffer,*shmaddr_out=0; struct sembuf sop; if((shmid_buffer=shmget(shm_key1,10*sizeof(int),0))==-1){ if((shmaddr_buffer=(int*)shmat(shmid_buffer,null,0))==(int*)-1){ exit(2); if((shmid_out=shmget(shm_key2,sizeof(int),0))==-1){ exit(3); if((shmaddr_out=(int*)shmat(shmid_out,null,0))==(int*)-1){ exit(4); if ((semid=semget(sem_key,3,0))==-1) { perror("semget"); exit(5); sop.sem_num=full; sop.sem_op=-1; sop.sem_num=mutex; sop.sem_op=-1; ]); printf("elemento retirado do buffer: %d\n",shmaddr_buffer[*shmaddr_out *shmaddr_out=(*shmaddr_out+1)%10; sop.sem_num=mutex; sop.sem_op=1;
sop.sem_num=empty; sop.sem_op=1;