Guest User

Untitled

a guest
Dec 16th, 2017
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.70 KB | None | 0 0
  1. char firstInput[MAX_LINE];
  2. char endMsg = EOT;
  3. int pipes[4][2], i, pid;
  4. ssize_t byteSent;
  5.  
  6. for(i=0; i<4; i++)
  7. {
  8. if(pipe(pipes[i]) < 0)
  9. {
  10. printf("couldnt make pipe..");
  11. }
  12. }
  13.  
  14. scanf("%s", firstInput);
  15. pid=fork(); //Writer process starts
  16. if(pid==(pid_t)0)
  17. {
  18. //inside Writer process:
  19.  
  20. close(pipes[READER32_P][INPUT]);
  21. close(pipes[READER32_P][OUTPUT]);
  22. close(pipes[READER64_p][INPUT]);
  23. close(pipes[READER64_p][OUTPUT]);
  24. close(pipes[READERS_P][INPUT]);
  25. close(pipes[READERS_P][OUTPUT]);
  26. close(pipes[WRITER_P][OUTPUT]);
  27.  
  28. Writer(pipes, firstInput);
  29. exit(EXIT_SUCCESS);
  30. }
  31. else
  32. {
  33. pid=fork();
  34. if(pid==(pid_t)0) //Reader32 process starts
  35. {
  36. //inside Reader32 process:
  37.  
  38. close(pipes[WRITER_P][INPUT]);
  39. close(pipes[WRITER_P][OUTPUT]);
  40. close(pipes[READER64_p][INPUT]);
  41. close(pipes[READER64_p][OUTPUT]);
  42. close(pipes[READERS_P][INPUT]);
  43. close(pipes[READER32_P][OUTPUT]);
  44.  
  45. Reader32(pipes);
  46. exit(EXIT_SUCCESS);
  47. }
  48. else
  49. {
  50.  
  51. pid=fork(); //Reader64 process starts
  52. if(pid == (pid_t)0)
  53. {
  54. //inside Reader64:
  55.  
  56. close(pipes[WRITER_P][INPUT]);
  57. close(pipes[WRITER_P][OUTPUT]);
  58. close(pipes[READER32_P][INPUT]);
  59. close(pipes[READER32_P][OUTPUT]);
  60. close(pipes[READERS_P][INPUT]);
  61. close(pipes[READER64_p][OUTPUT]);
  62.  
  63.  
  64. Reader64(pipes);
  65. exit(EXIT_SUCCESS);
  66. }
  67. else
  68. {
  69. //main process:
  70.  
  71. close(pipes[WRITER_P][INPUT]);
  72. close(pipes[READER32_P][INPUT]);
  73. close(pipes[READER64_p][INPUT]);
  74. close(pipes[READERS_P][OUTPUT]);
  75.  
  76. char msg = OK;
  77. int lastInput = 0;
  78. int polyType;
  79. unsigned long long polygon;
  80. while(!lastInput)
  81. {
  82. polygon = 0;
  83. scanf("%d", &polyType);
  84. if(polyType==32)
  85. {
  86. write(pipes[READER32_P][OUTPUT], &msg, sizeof(char));
  87. }
  88. else if(polyType==64)
  89. {
  90. byteSent = write(pipes[READER64_p][OUTPUT], &msg, sizeof(char));
  91. printf("sent %zd bytes from main_process to reader64n msg sent is %cn", byteSent, msg);
  92. }
  93. wait(NULL);
  94. read(pipes[READERS_P][INPUT], &polygon, sizeof(unsigned long long int));
  95. if((polygon & 1) > 0)
  96. lastInput=1;
  97. write(pipes[WRITER_P][OUTPUT], &polygon, sizeof(unsigned long long int));
  98. }
  99. //sending ending msgs to all child processes:
  100.  
  101. write(pipes[WRITER_P][OUTPUT], &endMsg, sizeof(char));
  102. write(pipes[READER32_P][OUTPUT], &endMsg, sizeof(char));
  103. write(pipes[READER64_p][OUTPUT], &endMsg, sizeof(char));
  104.  
  105. //closing left pipes:
  106.  
  107. close(pipes[WRITER_P][OUTPUT]);
  108. close(pipes[READER32_P][OUTPUT]);
  109. close(pipes[READER64_p][OUTPUT]);
  110. close(pipes[READERS_P][INPUT]);
  111.  
  112. //finishing the process:
  113.  
  114. printf("main_process pid=%d is going to exit",getpid());
  115. return 0;
  116. }
  117. }
  118. }
  119.  
  120. printf("Reader32 started...n");
  121. unsigned int endMsgRcvd=0;
  122. ssize_t byteSent;
  123. char reader32Buffer[MAX_LINE];
  124. unsigned long long int polygon32;
  125. unsigned long long int temp32;
  126. while(!endMsgRcvd)
  127. {
  128. byteSent = read(pipes[READER32_P][INPUT],reader32Buffer,MAX_LINE);
  129. if(reader32Buffer[0] == EOT)
  130. {
  131. endMsgRcvd = 1;
  132. break;
  133. }
  134. else
  135. {
  136. polygon32 = 0;
  137. temp32 = 0;
  138. scanf("%llx", &polygon32);
  139. scanf("%llx", &temp32);
  140. temp32 <<= 32;
  141. polygon32 |= temp32;
  142. write(pipes[READERS_P][OUTPUT], &polygon32, sizeof(unsigned long long));
  143. }
  144. }
  145. close(pipes[READER32_P][INPUT]);
  146. close(pipes[READERS_P][OUTPUT]);
  147. fprintf(stderr, "reader32 pid=%d is going to exit...", getpid());
  148.  
  149. printf("Reader32 started...n");
  150. unsigned int endMsgRcvd=0;
  151. ssize_t byteSent;
  152. char reader32Buffer[MAX_LINE];
  153. unsigned long long int polygon32;
  154. unsigned long long int temp32;
  155. while(!endMsgRcvd)
  156. {
  157. byteSent = read(pipes[READER32_P][INPUT],reader32Buffer,MAX_LINE);
  158. if(reader32Buffer[0] == EOT)
  159. {
  160. endMsgRcvd = 1;
  161. break;
  162. }
  163. else
  164. {
  165. polygon32 = 0;
  166. temp32 = 0;
  167. scanf("%llx", &polygon32);
  168. scanf("%llx", &temp32);
  169. temp32 <<= 32;
  170. polygon32 |= temp32;
  171. write(pipes[READERS_P][OUTPUT], &polygon32, sizeof(unsigned long long));
  172. }
  173. }
  174. close(pipes[READER32_P][INPUT]);
  175. close(pipes[READERS_P][OUTPUT]);
  176. fprintf(stderr, "reader32 pid=%d is going to exit...", getpid());
Add Comment
Please, Sign In to add comment