|
Appunti informatica |
|
Visite: 1187 | Gradito: | [ Picolo appunti ] |
Leggi anche appunti:Complemento a unoComplemento a uno L'operatore di complemento a uno è rappresentato con la tilde Problemi di cooperazione nel modello a scambio di messaggiProblemi di cooperazione nel modello a scambio di messaggi VIII) Scrivere La gestione degli erroriLa gestione degli errori Le librerie della maggior parte dei compilatori implementano |
Impiego di file
XIII) Si realizzino due processi che interagiscono tramite memoria comune al fine di leggere dati da un disco. Il primo legge da disco blocchi di dati e li deposita in un insieme di buffer allocati in memoria comune. Il secondo processo stampa a video tutto ciò che trova in tali buffer.
Descrizione: Il programma presentato è un tipico esempio di cooperazione tra processi pertanto si è scelto di realizzarlo facendo riferimento al problema Produttori/Consumatori, con uso di un buffer multiplo di memoria comune, e facendo sincronizzare i due processi mediante scambio di messaggi. In pratica, il processo che legge i dati dal disco per poi depositarli nel buffer di memoria condivisa funge da produttore, mentre il processo che legge i dati dal buffer e li stampa a video funge da consumatore. I due processi interagiscono come segue:
Il produttore legge un blocco dati alla volta dal file finquando non ne viene raggiunta la fine.
Ad ogni lettura, il produttore deposita il blocco dati nel buffer di memoria comune, invia al consumatore una messaggio di SENT (Send Asincrona) con cui lo informa che un blocco dati è disponibile e si mette in attesa di un ACK da parte del consumatore (fondamentale perchè alla prossima lettura il contenuto del buffer sarà sovrascritto e finchè il consumatore non ha ricevuto il blocco dati corrente nessun'altra lettura è possibile).
Il consumatore è perennemente in attesa (Receive Bloccante) che un blocco dati sia disponibile, quando lo riceve ne stampa il contenuto a video e dopo invia l'ACK al produttore.
Quando il produttore è giunto (in lettura) alla fine del file, comunica al consumatore questa circostanza, il consumatore stampa a video un messaggio che segnala la fine delle operazioni ed entrambi terminano.
Programma XIII.C
#include <sys/types.h>
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/wait.h>
#include <fcntl.h>
#define DIM 256 //Dimensione del Buffer condiviso
#define DIM_MSG (sizeof(unsigned int)) //Cardinalità del Messaggio
#define SENT 0 //Tipi del Messaggio
#define ACK 1
typedef struct Messaggio;
void main()
//----- ALLOCAZIONE BUFFER DI MEMORIA CONDIVISA -----
key_t Key_Buf=IPC_PRIVATE; //Chiave del buffer
int ID_Buf; //Identificatore del buffer
char* Ptr_Buf; //Puntatore al buffer
ID_Buf=shmget(Key_Buf, DIM, IPC_CREAT|0664); //Viene allocato un segmento di memoria di dimensione almeno
//pari DIM, gli viene associato un ID e viene creata una
//struttura dati ausiliaria che consenta di gestirlo
//RW per User, RW per Gruppo, R only per Others
if (ID_Buf==-1)
Ptr_Buf=shmat(ID_Buf, 0, 0); //Il segmento allocato viene annesso al segmento dati
//del processo al primo indirizzo disponibile così come
//specificato dal sistema
if (Ptr_Buf==(char*)-1)
//----- GENERAZIONE DEL FIGLIO PRODUTTORE -----
pid=fork(); //Generazione del figlio Produttore
if (pid==-1) else if (!pid)
do
if (N_Byte>=0)
//Rimane in attesa di un messaggio dal Consumatore
msgrcv(ID_Msg, (const void*)&msg, DIM_MSG, ACK, 0);
} while(N_Byte==DIM-1); //in caso contrario, con l'ultimo
//trasferimento si è raggiunto l'EOF
close(fd); //Chiusura del file
exit(0); //Il figlio Produttore termina correttamente
}
//----- GENERAZIONE DEL FIGLIO CONSUMATORE -----
pid=fork(); //Generazione del figlio Consumatore
if (pid==-1) else if (!pid) else
}
}
exit(0); //Il figlio Consumatore termina correttamente
}
//----- SINCRONIZZAZIONE DEL PADRE CON I FIGLI -----
for(i=0; i<2; i++)
//----- RILASCIO BUFFER E CODA DI MESSAGGI -----
shmctl(ID_Buf, IPC_RMID, 0);
msgctl(ID_Msg, IPC_RMID, 0);
Appunti su: produttore consumatore con file in php, |
|