Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <zconf.h>
- #include <sys/file.h>
- #include <sys/stat.h>
- #include <string.h>
- #include <signal.h>
- #define piperead 0
- #define pipewrite 1
- int pipe_fd1[2];
- int pipe_fd2[2];
- void padre(char* fileInput);
- void figlio1(char* fileInput);
- void figlio2(char *string);
- void handler(int segnale_ricevuto){
- printf("Il segnale che ho ricevuto è %d\n", segnale_ricevuto);
- }
- int getFileDimension(const char* fileName){
- struct stat st;
- if(stat(fileName, &st) != 0){
- perror("File doesn't exist\n");
- }
- return st.st_size;
- }
- char* getNCharFromEndFile(char* fileInput, int n){
- int fd = open(fileInput, O_RDONLY);
- if(fd==-1)perror("open");
- int resL=lseek(fd,-n,SEEK_END);
- if(resL==-1)perror("lseek");
- char *buffer = malloc(sizeof(char));
- int res = read(fd, buffer, 1);
- if(res==-1)perror("read");
- return buffer;
- }
- char* getNCharFromFile(char* fileInput, int n){
- int fd = open(fileInput, O_RDONLY);
- if(fd==-1)perror("open");
- int resL=lseek(fd,n,SEEK_SET);
- if(resL==-1)perror("lseek");
- char *buffer = malloc(sizeof(char));
- int res = read(fd, buffer, 1);
- if(res==-1)perror("read");
- return buffer;
- }
- int main(int argc, char* argv[]) {
- printf("%s\n", argv[1]);
- printf("%s\n", argv[2]);
- if(argc!=3)
- exit(9);
- signal(SIGINT,handler); /* 2 interrupt */
- signal(SIGKILL,handler); /* 9 kill */
- signal(SIGTERM,handler); //15
- signal(SIGSEGV,handler); //11
- signal(SIGPIPE,handler); //14
- pid_t sons[2]; //array di pid per i processi
- if (pipe(pipe_fd1)==-1){
- fprintf(stderr, "Pipe Failed" );
- return 1;
- }
- if (pipe(pipe_fd2)==-1){
- fprintf(stderr, "Pipe Failed" );
- return 1;
- }
- switch(sons[0]=fork()){ //Figlio 1
- case -1: perror("Errore fork 1"); break;
- case 0:{
- figlio1(argv[1]);
- } break;
- default:
- switch(sons[1]=fork()){ //Figlio 2
- case -1: perror("Errore fork 2"); break;
- case 0:{
- figlio2(argv[2]);
- } break;
- default:
- padre(argv[1]);
- exit(0);
- break;
- }
- break;
- }
- waitpid(sons[0],NULL,0);
- waitpid(sons[1],NULL,0);
- return 0;
- }
- void figlio2(char *fileOutput) {
- char* readFromFiglio1 = malloc(sizeof(char));
- close(pipe_fd1[pipewrite]);
- close(pipe_fd1[piperead]);
- close(pipe_fd2[pipewrite]);
- int fd = open(fileOutput, O_WRONLY | O_CREAT | O_APPEND);
- while((read(pipe_fd2[piperead],readFromFiglio1,1))>0){
- printf("Figlio 2 deve scrivere: %s\n",readFromFiglio1);
- write(fd,readFromFiglio1,1);
- }
- close(fd);
- close(pipe_fd2[piperead]);
- }
- void figlio1(char* fileInput) {
- close(pipe_fd1[pipewrite]);
- close(pipe_fd2[piperead]);
- int index = 0;
- char* readFromPadre = malloc(sizeof(char));
- while((read(pipe_fd1[piperead],readFromPadre,1))>0){
- char* readFromFiglio1 = getNCharFromFile(fileInput,index);
- printf("Padre: %s, Figlio: %s, Index; %d\n",readFromPadre, readFromFiglio1,index);
- if(strcmp(readFromPadre,readFromFiglio1)==0)
- write(pipe_fd2[pipewrite], readFromPadre, 1);
- index++;
- }
- close(pipe_fd2[pipewrite]);
- close(pipe_fd1[piperead]);
- }
- void padre(char* fileInput) {
- close(pipe_fd1[piperead]);
- close(pipe_fd2[piperead]);
- close(pipe_fd2[pipewrite]);;
- int lenght = getFileDimension(fileInput);
- for(int i=1; i<lenght+1;i++){
- char* c = getNCharFromEndFile(fileInput,i);
- if(write(pipe_fd1[pipewrite], c, 1)<0) {
- perror("Write of pipe_fd1 error\n");
- }
- }
- close(pipe_fd1[pipewrite]);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement