Advertisement
Guest User

Untitled

a guest
Dec 17th, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.17 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5. #include <unistd.h>
  6. #include <errno.h>
  7. #include <sys/types.h>
  8. #include <sys/ipc.h>
  9. #include <sys/msg.h>
  10. #include <signal.h>
  11. #include <ctype.h>
  12. #include <fcntl.h>
  13. #include<string.h>
  14. #include<sys/wait.h>
  15.  
  16. char strin[100];
  17. int pipep1p2[2];
  18. int pipep2p3[2];
  19. pid_t proces1;
  20. pid_t proces2;
  21. pid_t proces3;
  22. int qid1;
  23. int qid2;
  24. int qid3;
  25. key_t msgkey1;
  26. key_t msgkey2;
  27. key_t msgkey3;
  28.  
  29. struct mymsgbuf
  30. {
  31. long type;
  32. int signb;
  33. }msg;
  34.  
  35. int send_message( int qid, struct mymsgbuf *qbuf )
  36. {
  37. int result, length;
  38.  
  39. /* The length is essentially the size of the structure minus sizeof(mtype) */
  40. length = sizeof(struct mymsgbuf) - sizeof(long);
  41.  
  42. if((result = msgsnd( qid, qbuf, length, 0)) == -1)
  43. {
  44. return(-1);
  45. }
  46.  
  47. return(result);
  48. }
  49.  
  50.  
  51. int read_message( int qid, long type, struct mymsgbuf *qbuf )
  52. {
  53. int result, length;
  54.  
  55. /* The length is essentially the size of the structure minus sizeof(mtype) */
  56. length = sizeof(struct mymsgbuf) - sizeof(long);
  57.  
  58. if((result = msgrcv( qid, qbuf, length, type, 0)) == -1)
  59. {
  60. return(-1);
  61. }
  62.  
  63. return(result);
  64. }
  65.  
  66.  
  67. int open_queue( key_t keyval )
  68. {
  69. int qid;
  70.  
  71. if((qid = msgget( keyval, IPC_CREAT | 0660 )) == -1)
  72. {
  73. return(-1);
  74. }
  75. return(qid);
  76. }
  77.  
  78.  
  79. void sig_handlerp1(int signo)
  80. {
  81. if (signo == 12)
  82. {
  83. printf("P1 id :%d,received SIGUSR2 (nb: %d)\n",getpid(),signo);
  84. if(( qid1 = open_queue( msgkey1)) == -1)
  85. {
  86. perror("open_queue");
  87. exit(1);
  88. }
  89. if((read_message( qid1, 1 , &msg )) == -1)
  90. {
  91. perror("send_message");
  92. exit(1);
  93. }
  94. }
  95. kill(proces2,12);
  96. sleep(10);
  97. }
  98.  
  99. void sig_handlerp2(int signo)
  100. {
  101. if (signo == 12)
  102. {
  103. printf("P2 id :%d,received SIGUSR2 (nb: %d)\n",getpid(),signo);
  104. if(( qid2 = open_queue( msgkey1)) == -1)
  105. {
  106. perror("open_queue");
  107. exit(1);
  108. }
  109. if((read_message( qid2, 1 , &msg )) == -1)
  110. {
  111. perror("send_message");
  112. exit(1);
  113. }
  114. }
  115. kill(proces3,12);
  116. sleep(10);
  117. }
  118.  
  119. void sig_handlerp3(int signo)
  120. {
  121. if (!(signo == 12))
  122. {
  123. printf("P3 id :%d,received (nb: %d)\n",getpid(),signo);
  124. printf("parent P3: %d",getppid());
  125. kill(getppid(),signo);
  126. sleep(10);
  127. }
  128. else printf("P3 (%d) received signal nb: %d\n",getpid(),signo);
  129. }
  130.  
  131. void sig_handlerpm(int signo)
  132. {
  133. printf("PM (%d) received signal nb: %d\n",getpid(),signo);
  134. msg.type = 1;
  135. printf("flag1");
  136. msg.signb = signo;
  137. printf("flag2");
  138. if((send_message( qid1, &msg )) == -1)
  139. {
  140. printf("send_message");
  141. exit(1);
  142. }
  143. printf("flag3");
  144. if((send_message( qid2, &msg )) == -1)
  145. {
  146. printf("send_message");
  147. exit(1);
  148. }
  149. printf("flag4");
  150. if((send_message( qid3, &msg )) == -1)
  151. {
  152. printf("send_message");
  153. exit(1);
  154. }
  155. printf("flag5");
  156. kill(proces1,12);
  157. printf("flag6");
  158. sleep(10);
  159. }
  160.  
  161. pid_t wrap(void (*process_callback)(void))
  162. {
  163. printf("creating process\n");
  164. pid_t pid = fork();
  165. switch(pid) {
  166. case -1:
  167. printf("Blad funkcji fork.");
  168. exit(1);
  169. case 0:
  170. process_callback();
  171. return 0;
  172. default:
  173. return pid;
  174. }
  175. }
  176.  
  177.  
  178. void p1()
  179. {
  180. int i;
  181. for(i=1;i<65;i++)
  182. {
  183. signal(i, sig_handlerp1);
  184. }
  185. char buffer[32];
  186. char fileName[50];
  187. size_t bufsize = 32;
  188. char *b = buffer;
  189. int choice;
  190. close(pipep1p2[0]);
  191. printf("P1 id: %d parent id: %d\n",getpid(),getppid());
  192. while(1)
  193. {
  194. sleep(1);
  195. printf("\nType 1: reading from stdin\n 2: reading from file\n");
  196. scanf("%d",&choice);
  197. if(choice == 1)
  198. {
  199. printf("Type input:\n");
  200. getline(&b,&bufsize,stdin);
  201. getline(&b,&bufsize,stdin);
  202. write(pipep1p2[1],b,32);
  203. choice = 0;
  204. }
  205. if(choice == 2)
  206. {
  207. printf("Type file name:\n");
  208. scanf("%s",fileName);
  209. FILE* file = fopen(fileName,"r");
  210. while(fgets(buffer,sizeof(buffer),file))
  211. {
  212. write(pipep1p2[1],buffer,32);
  213. }
  214. fclose(file);
  215. choice = 0;
  216. }
  217. }
  218. }
  219.  
  220. void p2()
  221. {
  222. int i;
  223. for(i=1;i<65;i++)
  224. {
  225. signal(i, sig_handlerp2);
  226. }
  227. int* length;
  228. char c;
  229. printf("P2 id: %d parent id: %d\n",getpid(),getppid());
  230. close(pipep1p2[1]);
  231. close(pipep2p3[0]);
  232. while(1)
  233. {
  234. *length = 0;
  235. read(pipep1p2[0],strin,32);
  236. for(i=0;i<strlen(strin);i++)
  237. {
  238. c=strin[i];
  239. if(isspace(c)==0)(*length)++;
  240. }
  241. write(pipep2p3[1],length,4);
  242. }
  243. }
  244.  
  245. void p3()
  246. {
  247. int i;
  248. for(i=1;i<65;i++)
  249. {
  250. signal(i, sig_handlerp3);
  251. }
  252. int* lengthp3;
  253. printf("P3 id: %d parent id: %d\n",getpid(),getppid());
  254. close(pipep2p3[1]);
  255. while(1)
  256. {
  257. read(pipep2p3[0],lengthp3,4);
  258. printf("string length P3: %d\n",*lengthp3);
  259. }
  260. }
  261.  
  262. int main()
  263. {
  264. printf("PM id: %d\n",getpid());
  265. int i;
  266. for(i=1;i<65;i++)
  267. {
  268. signal(i, sig_handlerpm);
  269. }
  270.  
  271. /* Generate our IPC key value */
  272. msgkey1 = ftok(".", 'a');
  273. msgkey2 = ftok(".", 'b');
  274. msgkey3 = ftok(".", 'c');
  275. /* Open/create the queue */
  276. if(( qid1 = open_queue( msgkey1)) == -1) {
  277. perror("open_queue");
  278. exit(1);
  279. }
  280. if(( qid2 = open_queue( msgkey2)) == -1) {
  281. perror("open_queue");
  282. exit(1);
  283. }
  284. if(( qid3 = open_queue( msgkey3)) == -1) {
  285. perror("open_queue");
  286. exit(1);
  287. }
  288. /* Load up the message with arbitrary test data
  289. msg.mtype = 1;
  290. msg.request = 1;
  291. msg.salary = 1000.00;
  292.  
  293. Bombs away!
  294. if((send_message( qid, &msg )) == -1) {
  295. perror("send_message");
  296. exit(1);
  297. }*/
  298.  
  299. pipe(pipep1p2);
  300. pipe(pipep2p3);
  301.  
  302. pid_t proces1 = wrap(p1);
  303. if(proces1==0){printf("P1: ended %d\n",getpid());}
  304. if(proces1!=0)
  305. {
  306. pid_t proces2 = wrap(p2);
  307. if(proces2==0)printf("P2: ended %d\n",getpid());
  308. if(proces2!=0)
  309. {
  310. pid_t proces3 = wrap(p3);
  311. if(proces3==0)printf("P3: ended %d\n",getpid());
  312. if(proces3!=0)
  313. {
  314. wait(NULL);
  315. wait(NULL);
  316. wait(NULL);
  317. }
  318. }
  319. }
  320. return 0;
  321. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement