Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #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 <sys/sem.h>
- #include <fcntl.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <sys/shm.h>
- struct sembuf buf;
- char ** filepath;
- int fd;
- int sid;
- FILE * file;
- char _buf[4096];
- char * path;
- int fd;
- char _handler[4096];
- void handler(int sig)
- {
- printf("\n");
- printf("Nel buffer \n");
- sprintf(_handler,"cat %s",filepath[1]);
- system(_handler);
- }
- void consuma()
- {
- printf("Figlio numero %d\n",getpid());
- int ok;
- sigset_t sig;
- struct sigaction s_a;
- sigfillset(&sig);
- s_a.sa_handler = handler;
- s_a.sa_mask = sig;
- sigaction(SIGINT,&s_a,NULL);
- fd = open(path,O_RDWR | O_CREAT | O_TRUNC,0666);
- file = fdopen(fd,"w");
- while(1)
- {
- printf("Attendo \n");
- _retry:
- buf.sem_num = 1;
- buf.sem_op = -1;
- buf.sem_flg = 0;
- if((ok = semop(sid,&buf,1)) == -1 && errno == EINTR)
- {
- goto _retry;
- }
- fprintf(file,"%s",_buf);
- fflush(file);
- printf("Ok %d\n",errno);
- _retry2:
- buf.sem_num = 0;
- buf.sem_op = 1;
- buf.sem_flg = 0;
- if((ok = semop(sid,&buf,1)) == -1 && errno == EINTR)
- {
- goto _retry2;
- }
- }
- }
- int main(int argc,char ** argv)
- {
- printf("Padre %d\n",getpid());
- sigset_t sig_set;
- struct sigaction sig_act;
- if(sigfillset(&sig_set) == -1)
- {
- printf("Errore sigfillset\n");
- exit(-1);
- }
- sig_act.sa_handler = handler;
- sig_act.sa_mask = sig_set;
- if(sigaction(SIGINT,&sig_act,NULL) == -1)
- {
- printf("Errore sigaction\n");
- exit(-1);
- }
- filepath = argv; // salvo il pathname dei file
- path = filepath[1];
- fd = open(path,O_RDWR | O_CREAT | O_TRUNC,0666);
- file = fdopen(fd,"w");
- if((sid = semget(IPC_PRIVATE,2,IPC_CREAT | 0666)) == -1)
- {
- printf("semget error \n");
- exit(-1);
- }
- if(semctl(sid,0,SETVAL,1) == -1)
- {
- printf("semctl error\n");
- exit(-1);
- }
- if(semctl(sid,1,SETVAL,0) == -1)
- {
- printf("Errore semctl \n");
- exit(-1);
- }
- pid_t pid;
- pid = fork();
- if(pid == 0) //figlio
- {
- consuma();
- }
- int ret;
- while(1)
- {
- retry:
- buf.sem_num = 0;
- buf.sem_op = -1;
- buf.sem_flg = 0;
- if((ret = semop(sid,&buf,1)) == -1 && errno == EINTR)
- {
- goto retry;
- }
- printf("Immettere stringa \n");
- retry_4:
- if((ret = scanf("%s",_buf)) == EOF && errno == EINTR)
- {
- goto retry_4;
- }
- retry2:
- buf.sem_num = 1;
- buf.sem_op = 1;
- buf.sem_flg = 0;
- if((ret = semop(sid,&buf,1)) == -1 && errno == EINTR)
- {
- goto retry2;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement