Advertisement
Guest User

Untitled

a guest
Jan 19th, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.87 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <semaphore.h>
  5. #include <fcntl.h>
  6. #include <unistd.h>
  7. #include <sys/wait.h>
  8. #include <sys/shm.h>
  9.  
  10. typedef sem_t Semaphore;
  11. Semaphore *sem1, *sem2;
  12.  
  13.  
  14. int main(int argc, char *argv[])
  15. {
  16. pid_t pid0;
  17. pid_t pid1;
  18.  
  19. sem1 = sem_open ("Sem1", O_CREAT | O_EXCL, 0644, 1); //semaphores init
  20. sem2 = sem_open ("Sem2", O_CREAT | O_EXCL, 0644, 0);
  21. key_t shmkey;
  22. int shmid;
  23. int *x;
  24. shmkey = ftok ("/dev/null",5); //shared var init
  25. shmid = shmget(shmkey, sizeof (int),0644 | IPC_CREAT);
  26.  
  27.  
  28. if(shmid<0) //error check for the shared memory
  29. {
  30. perror("shmget\n");
  31. exit(1);
  32. }
  33. x = (int*) shmat(shmid,NULL,0);
  34. *x = 0;
  35.  
  36. pid0 = fork();
  37. if (pid0 > 0) //parent
  38. {
  39. pid0 = fork();
  40. if(pid0>0)
  41. {
  42. sem_wait(sem2);
  43. sem_post(sem2);
  44. sem_wait(sem1);
  45. printf("Before process 1: %d ",*x);
  46. *x = *x * 2;
  47. printf ("after 1:%d \n",*x);
  48. sem_post(sem1);
  49. wait(NULL);
  50.  
  51. }
  52. else if (pid0 == 0) //child
  53. {
  54.  
  55. sem_wait(sem1);
  56. printf("Before process 2: %d ",*x);
  57. *x =*x * (* x);
  58. printf ("after 2:%d \n",*x);
  59. sem_post(sem2);
  60. wait(NULL);
  61. pid1 = fork();
  62. }
  63. else
  64. {
  65. sem_unlink("Sem1");
  66. sem_unlink("Sem2");
  67. sem_close(sem1);
  68. sem_close(sem2);
  69. printf("Fork1 failed. \n");
  70. }
  71. sem_unlink ("Sem1");
  72. sem_close(sem1);
  73. sem_unlink("Sem2");
  74. sem_close(sem2);
  75. }
  76. else if (pid0 == 0) //child of the child
  77. {
  78.  
  79. sem_wait(sem2);
  80. printf("Before process 3: %d ",*x);
  81.  
  82. *x = *x + 3;
  83. printf("after 3:%d \n",*x);
  84. sem_post(sem2);
  85. sem_post(sem1);
  86. }
  87.  
  88.  
  89. else
  90. {
  91. sem_unlink ("Sem1");
  92. sem_close(sem1);
  93. sem_unlink("Sem2");
  94. sem_close(sem2);
  95. printf ("Fork2 error.\n");
  96. }
  97. exit (0);
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement