Advertisement
Guest User

Untitled

a guest
Dec 7th, 2019
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.83 KB | None | 0 0
  1. #include "stdlib.h"
  2. #include "stdio.h"
  3. #include "string.h"
  4. #include <unistd.h>
  5. #include <signal.h>
  6. #include <sys/types.h>
  7. #include <sys/wait.h>
  8. #include <sys/stat.h>
  9. #include <fcntl.h>
  10. #include <ctype.h>
  11.  
  12.  
  13. #define blocksize 4096
  14. int mypipe[2];
  15. char file1[100],file2[100];
  16.  
  17. void sigusr1handler(int sig){
  18. if(sig == SIGUSR1){
  19. printf("I GOT SIGUSR1!\n");
  20. dup2(mypipe[1],1);
  21. execlp("cat","cat",file1,NULL);
  22. printf("Failed execlp on first child!\n");
  23. exit(-7);
  24. }
  25. }
  26. void fiu1(){
  27. struct sigaction s;
  28. s.sa_flags = 0;
  29. s.sa_handler = sigusr1handler;
  30.  
  31. close(mypipe[0]);
  32.  
  33. if(sigaction(SIGUSR1,&s,NULL)<0){//pregatim fiu1 sa primeasca SIGUSR1
  34. printf("Error at sigaction SIGUSR1!\n");
  35. exit(-6);
  36. }
  37.  
  38. while(1){
  39. printf("Child 1: I have pid=%d\n",getpid());//afisam in fiu1 pid-ul lui pana primeste SIGUSR1
  40. }
  41. }
  42.  
  43. void sigusr2handler(int sig){
  44. if(sig == SIGUSR2){
  45. printf("I GOT SIGUSR2!\n");
  46. dup2(mypipe[1],1);
  47. execlp("cat","cat",file2,NULL);
  48. printf("Failed execlp on first child!\n");
  49. exit(-7);
  50. }
  51. }
  52. void fiu2(){
  53. struct sigaction s;
  54. s.sa_flags = 0;
  55. s.sa_handler = sigusr2handler;
  56.  
  57. close(mypipe[0]);
  58. if(sigaction(SIGUSR2,&s,NULL)<0){//pregatim fiu2 sa primeasca SIGUSR2
  59. printf("Error at sigaction SIGUSR2!\n");
  60. exit(-6);
  61. }
  62.  
  63. while(1){
  64. printf("Child 2: I have pid=%d \n",getpid());//afisam pid-ul fiului2 pana primeste SIGUSR2
  65. }
  66. }
  67. void siginthandler(int sig){
  68. if(sig == SIGINT){//cand primeste fiul3 SIGINT
  69. printf("I GOT SIGINT!\n");
  70. char buffer[blocksize];
  71. char aux[blocksize];
  72. int r;
  73. int k;
  74. while((r=read(mypipe[0],buffer,blocksize))>0){//citim din pipe cat mai este
  75. strcpy(aux,"");//golim ce e in aux
  76. k=0;
  77. for(int i=0;i<r;i++){//parcurgem litera cu litera
  78. if(buffer[i] == ' ' || buffer[i]=='\n'){//daca am gasit spatiu sau newline inseamna ca s-o terminat un cuvant, si il afisam
  79. aux[k] = '\0';
  80. printf("%s\n",aux);
  81. strcpy(aux,"");
  82. k=0;
  83. }
  84. else{//daca ii altceva inafara de spatiu sau litera, adaugam caracteru ca sa construim cuvantul
  85. aux[k]=buffer[i];
  86. k++;
  87. }
  88. }//poate asta se putea face mai destept da nu stiu cum..oricum n-are relevanta pentru pipeuri lucratu cu stringuri
  89. }
  90. close(mypipe[0]);
  91. exit(0);
  92. }
  93. }
  94. void fiu3(){
  95. struct sigaction s;
  96. s.sa_flags = 0;
  97. s.sa_handler = siginthandler;
  98.  
  99. close(mypipe[1]);
  100.  
  101. if(sigaction(SIGINT,&s,NULL)<0){//pregatim fiu3 sa primeasca SIGINT
  102. printf("Error at sigaction SIGINT!\n");
  103. exit(-6);
  104. }
  105.  
  106. while(1){
  107. printf("Child 3: I have pid=%d\n",getpid());//afisam pid-ul fiului 3 pana primeste SIGINT
  108. }
  109. }
  110.  
  111. void sigalarmhandler(int sig){
  112. printf("BOO!\n");
  113. exit(0);
  114. }
  115. int pid1,pid2,pid3;
  116.  
  117. void parinte(){
  118. close(mypipe[0]);
  119. close(mypipe[1]);
  120. printf("Sending SIGUSR1 to %d, SIGUSR2 to %d, SIGINT to %d.\n",pid1,pid2,pid3);
  121. kill(pid1,SIGUSR1);
  122. kill(pid2,SIGUSR2);
  123. kill(pid3,SIGINT);
  124. //trimitem semnalele la copii
  125. struct sigaction s;
  126. s.sa_flags = 0;
  127. s.sa_handler=sigalarmhandler;
  128. if(sigaction(SIGALRM,&s,NULL)<0){//pregatim parintele sa primeasca SIGALRM
  129. printf("Error on sigaction SIGALRM!\n");
  130. exit(-10);
  131. }
  132. alarm(7);//trimitem peste 7 secunde semnalul SIGALRM
  133. while(1);
  134. }
  135. int main(int argc, char *argv[]){
  136. if(argc != 3){
  137. printf("Usage:./%s file1 file2\n",argv[0]);
  138. exit(-1);
  139. }
  140.  
  141. strcpy(file1,argv[1]);
  142. strcpy(file2,argv[2]);
  143.  
  144. if(pipe(mypipe)<0){
  145. printf("Error at creating pipe!\n");
  146. exit(-2);
  147. }
  148.  
  149.  
  150. if((pid1=fork())<0){
  151. printf("Error at first fork!\n");
  152. exit(-3);
  153. }
  154. if(pid1==0){
  155. fiu1();
  156. }
  157.  
  158.  
  159. if((pid2=fork())<0){
  160. printf("Error at second fork!\n");
  161. exit(-4);
  162. }
  163. if(pid2==0){
  164. fiu2();
  165. }
  166.  
  167. if((pid3=fork())<0){
  168. printf("Error at third fork!\n");
  169. exit(-5);
  170. }
  171. if(pid3==0){
  172. fiu3();
  173. }
  174. sleep(0.5);//fara sleepu asta nu se intampla nimic
  175. parinte();
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement