Advertisement
Guest User

Untitled

a guest
Jan 21st, 2020
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.87 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <zconf.h>
  4. #include <sys/file.h>
  5. #include <sys/stat.h>
  6. #include <string.h>
  7. #include <signal.h>
  8.  
  9. #define piperead 0
  10. #define pipewrite 1
  11.  
  12. int pipe_fd1[2];
  13. int pipe_fd2[2];
  14. void padre(char* fileInput);
  15. void figlio1(char* fileInput);
  16. void figlio2(char *string);
  17.  
  18. void handler(int segnale_ricevuto){
  19. printf("Il segnale che ho ricevuto è %d\n", segnale_ricevuto);
  20. }
  21. int getFileDimension(const char* fileName){
  22. struct stat st;
  23. if(stat(fileName, &st) != 0){
  24. perror("File doesn't exist\n");
  25. }
  26. return st.st_size;
  27. }
  28.  
  29. char* getNCharFromEndFile(char* fileInput, int n){
  30. int fd = open(fileInput, O_RDONLY);
  31. if(fd==-1)perror("open");
  32.  
  33. int resL=lseek(fd,-n,SEEK_END);
  34. if(resL==-1)perror("lseek");
  35.  
  36. char *buffer = malloc(sizeof(char));
  37. int res = read(fd, buffer, 1);
  38. if(res==-1)perror("read");
  39. return buffer;
  40. }
  41. char* getNCharFromFile(char* fileInput, int n){
  42. int fd = open(fileInput, O_RDONLY);
  43. if(fd==-1)perror("open");
  44.  
  45. int resL=lseek(fd,n,SEEK_SET);
  46. if(resL==-1)perror("lseek");
  47.  
  48. char *buffer = malloc(sizeof(char));
  49. int res = read(fd, buffer, 1);
  50. if(res==-1)perror("read");
  51. return buffer;
  52. }
  53.  
  54. int main(int argc, char* argv[]) {
  55. printf("%s\n", argv[1]);
  56. printf("%s\n", argv[2]);
  57.  
  58. if(argc!=3)
  59. exit(9);
  60.  
  61. signal(SIGINT,handler); /* 2 interrupt */
  62. signal(SIGKILL,handler); /* 9 kill */
  63. signal(SIGTERM,handler); //15
  64. signal(SIGSEGV,handler); //11
  65. signal(SIGPIPE,handler); //14
  66.  
  67. pid_t sons[2]; //array di pid per i processi
  68.  
  69. if (pipe(pipe_fd1)==-1){
  70. fprintf(stderr, "Pipe Failed" );
  71. return 1;
  72. }
  73. if (pipe(pipe_fd2)==-1){
  74. fprintf(stderr, "Pipe Failed" );
  75. return 1;
  76. }
  77.  
  78. switch(sons[0]=fork()){ //Figlio 1
  79. case -1: perror("Errore fork 1"); break;
  80. case 0:{
  81. figlio1(argv[1]);
  82. } break;
  83. default:
  84. switch(sons[1]=fork()){ //Figlio 2
  85. case -1: perror("Errore fork 2"); break;
  86. case 0:{
  87. figlio2(argv[2]);
  88. } break;
  89. default:
  90. padre(argv[1]);
  91. exit(0);
  92. break;
  93. }
  94. break;
  95. }
  96.  
  97. waitpid(sons[0],NULL,0);
  98. waitpid(sons[1],NULL,0);
  99.  
  100. return 0;
  101. }
  102.  
  103. void figlio2(char *fileOutput) {
  104. char* readFromFiglio1 = malloc(sizeof(char));
  105. close(pipe_fd1[pipewrite]);
  106. close(pipe_fd1[piperead]);
  107. close(pipe_fd2[pipewrite]);
  108.  
  109. int fd = open(fileOutput, O_WRONLY | O_CREAT | O_APPEND);
  110.  
  111. while((read(pipe_fd2[piperead],readFromFiglio1,1))>0){
  112. printf("Figlio 2 deve scrivere: %s\n",readFromFiglio1);
  113. write(fd,readFromFiglio1,1);
  114. }
  115.  
  116. close(fd);
  117. close(pipe_fd2[piperead]);
  118. }
  119. void figlio1(char* fileInput) {
  120. close(pipe_fd1[pipewrite]);
  121. close(pipe_fd2[piperead]);
  122.  
  123. int index = 0;
  124. char* readFromPadre = malloc(sizeof(char));
  125. while((read(pipe_fd1[piperead],readFromPadre,1))>0){
  126. char* readFromFiglio1 = getNCharFromFile(fileInput,index);
  127. printf("Padre: %s, Figlio: %s, Index; %d\n",readFromPadre, readFromFiglio1,index);
  128.  
  129. if(strcmp(readFromPadre,readFromFiglio1)==0)
  130. write(pipe_fd2[pipewrite], readFromPadre, 1);
  131. index++;
  132. }
  133.  
  134. close(pipe_fd2[pipewrite]);
  135. close(pipe_fd1[piperead]);
  136. }
  137.  
  138. void padre(char* fileInput) {
  139. close(pipe_fd1[piperead]);
  140. close(pipe_fd2[piperead]);
  141. close(pipe_fd2[pipewrite]);;
  142.  
  143. int lenght = getFileDimension(fileInput);
  144. for(int i=1; i<lenght+1;i++){
  145. char* c = getNCharFromEndFile(fileInput,i);
  146. if(write(pipe_fd1[pipewrite], c, 1)<0) {
  147. perror("Write of pipe_fd1 error\n");
  148. }
  149. }
  150. close(pipe_fd1[pipewrite]);
  151. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement