Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*Implementare un programma che riceva in input tramite argv[2] un numero
- intero N maggiore o uguale ad 1 (espresso come una stringa di cifre
- decimali), e generi N nuovi processi. Ciascuno di questi leggera' in modo
- continuativo un valore intero da standard input, e lo comunichera' al
- processo padre tramite memoria condivisa. Il processo padre scrivera' ogni
- nuovo valore intero ricevuto su di un file, come sequenza di cifre decimali.
- I valori scritti su file devono essere separati dal carattere ' ' (blank).
- Il pathname del file di output deve essere comunicato all'applicazione
- tramite agv[1].
- Nel caso in cui non vi sia immissione in input, l'applicazione non deve
- consumare piu' del 5% della capacita' di lavoro della CPU.*/
- #include <unistd.h>
- #include <errno.h>
- #include <signal.h>
- #include <pthread.h>
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
- #include <sys/mman.h>
- #include <semaphore.h>
- #include <fcntl.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- long N, i;
- sem_t* semP; // parent sem
- sem_t* semC; // child sem
- int* shrbuff; // memoria condivisa
- int fd, rc;
- FILE* fp;
- pid_t pid;
- char* pathname;
- void handler(int sig);
- void childFunct(long childNum);
- int main(int argc, char* argv[]){
- // num process
- N = strtol(argv[2],NULL,10);
- if(argc < 3 || N < 1){
- printf("Not enough arguments (%d/2 given) or argv[2] < 1 (it's %ld)",argc, N);
- exit(-1);
- } else {
- // inizializzo memoria condivisa
- shrbuff = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS,0,0);
- if(shrbuff == NULL){
- printf("Error on mmap\n");
- exit(-1);
- }
- // apro il file
- strcpy(pathname, argv[1]);
- fd = open(pathname, O_RDWR|O_CREAT|O_TRUNC, 0666);
- if(fd == -1){
- printf("Error on open\n");
- exit(-1);
- }
- fp = fdopen(fd, "w+");
- if(fp == NULL){
- printf("fdopen error\n");
- exit(-1);
- }
- printf("Opened file %s", pathname);
- // inizializzo semafori
- semP = mmap(NULL, sizeof(sem_t), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS,0,0);
- if(semP == NULL){
- printf("mmap error\n");
- exit(-1);
- }
- semC = mmap(NULL, N*sizeof(sem_t), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS,0,0);
- if(semC == NULL){
- printf("mmap error\n");
- exit(-1);
- }
- for(i = 0; i<N; i++){
- rc = sem_init(&semC[i], 1, 0);
- if(rc == -1){
- printf("sem_init error\n");
- exit(-1);
- }
- }
- rc = sem_init(&semP[0], 1, (unsigned)N);
- if(rc == -1){
- printf("sem_init error\n");
- exit(-1);
- }
- // segnali
- signal(SIGINT, handler);
- // spawn child
- for(i = 0; i < N; i++){
- pid = fork();
- if(pid == 0){
- signal(SIGINT, SIG_IGN);
- childFunct(i);
- }
- }
- while(1){
- // prendo token da semP
- for(i = 0; i<N; i++){
- rc = sem_wait(&semP[0]);
- if(rc == -1){
- printf("semP wait error\n");
- exit(-1);
- }
- }
- printf("Founded value is %d", *shrbuff);
- fprintf(fp, "%d ", *shrbuff);
- fflush(fp);
- for(i = 0; i<N; i++){
- rc = sem_post(&semC[i]);
- if(rc == -1){
- printf("semP wait error\n");
- exit(-1);
- }
- }
- }
- }
- }
- void handler(int sig){
- if(sig == SIGINT){
- printf("\n\thandler activated\n");
- char command[1024];
- sprintf(command, "cat %s\n", pathname);
- system(command);
- }
- }
- void childFunct(long childNum){
- //int val;
- printf("child n.%ld born", childNum);
- while(1){
- rc = sem_wait(&semC[childNum]);
- if(rc == -1){
- printf("semC wait error\n");
- exit(-1);
- }
- sleep(1);
- printf("child %ld is scanning - write value\n", childNum);
- scanf("%d", *&shrbuff);
- printf("inserted %d", *shrbuff);
- rc = sem_post(&semP[0]);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement