Advertisement
Guest User

Untitled

a guest
Dec 9th, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.99 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/wait.h>
  4. #include <unistd.h>
  5. #include <fcntl.h>
  6. #include <sys/ipc.h>
  7. #include <sys/shm.h>
  8. #include <sys/sem.h>
  9.  
  10.  
  11. enum { BASE = 10 };
  12.  
  13. int main(int argc, char *argv[])
  14. {
  15. int n = (int) strtol(argv[1], NULL, BASE);
  16. key_t key = (int) strtol(argv[2], NULL, BASE);
  17. unsigned long long maxval = (int)strtol(argv[3], NULL, BASE);
  18. //int n = 2;
  19. //key_t key = 12;
  20. //unsigned long long maxval = 4;
  21. int sem_id = semget(key, n, 0666 | IPC_CREAT | IPC_EXCL);
  22. if (sem_id < 0) {
  23. //exit(1);
  24. }
  25.  
  26. int shm_id = shmget(key, 2 * sizeof(int), 0666 | IPC_CREAT | IPC_EXCL);
  27. if (shm_id < 0) {
  28. //exit(1);
  29. }
  30.  
  31. int *shmaddr = (int*) shmat(shm_id, NULL, 0);
  32. shmaddr[0] = 0;
  33. shmaddr[1] = 0;
  34.  
  35. for (int i = 0; i < n; i++) {
  36. pid_t pid = fork();
  37. if (pid == 0) {
  38. while (semop(sem_id, (struct sembuf[]){{i, -1, 0}}, 1) >= 0) {
  39. printf("%d %d %d\n", i + 1, shmaddr[0], shmaddr[1]);
  40. fflush(stdout);
  41. if(shmaddr[0] >= maxval) {
  42. semctl(sem_id, 0, IPC_RMID);
  43. //shmctl(shm_id, IPC_RMID, NULL);
  44. //exit(0);
  45. }
  46. shmaddr[0]++;
  47. shmaddr[1] = i + 1;
  48. int tmp = (((shmaddr[0] % n) * (shmaddr[0] % n)) % n * ((shmaddr[0] % n) * (shmaddr[0] % n)) % n) % n;
  49. if (semop(sem_id,(struct sembuf[]){{tmp, 1, 0}},1) < 0) {
  50. //exit(1);
  51. }
  52. }
  53. } else if (pid < 0) {
  54. exit(1);
  55. }
  56. }
  57. if (semop(sem_id, (struct sembuf[]) {{0, 1, 0}}, 1) < 0) {
  58. //exit(1);
  59. }
  60.  
  61. while (wait(NULL) > 0) {
  62.  
  63. }
  64. //shmdt(shmaddr);
  65. if (semctl(sem_id, 0, IPC_RMID) < 0) {
  66. //exit(1);
  67. }
  68. if (shmctl(shm_id, 0, IPC_RMID) < 0) {
  69. //exit(1);
  70. }
  71.  
  72.  
  73. return 0;
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement