Advertisement
Guest User

Untitled

a guest
Dec 6th, 2016
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.83 KB | None | 0 0
  1. #include <sys/types.h>
  2. #include <sys/ipc.h>
  3. #include <sys/sem.h>
  4. #include <string.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <sys/wait.h>
  8. #include <sys/shm.h>
  9. #include <unistd.h>
  10.  
  11. int main(int argc, char **argv)
  12. {
  13. int semid, shmid, key;
  14. int *shmaddr;
  15. int nproc, len, iter_count;
  16. len = atoi(argv[1]);
  17. key = atoi(argv[2]);
  18. nproc = atoi(argv[3]);
  19. iter_count = atoi(argv[4]);
  20. semid = semget(key, len, 0666 | IPC_CREAT);
  21. shmid = shmget(key, sizeof(shmaddr[0]) * len, 0666 | IPC_CREAT);
  22. shmaddr = (int *)shmat(shmid, NULL, 0);
  23. int *mass = malloc(sizeof(int) * nproc);
  24. int i;
  25. for (i = 0; i < nproc; i++) {
  26. mass[i] = atoi(argv[5 + i]);
  27. }
  28. for (i = 0;i < len; i++) {
  29. scanf("%d", &shmaddr[i]);
  30. }
  31. for (i = 0; i < nproc; i++) {
  32. if (!fork()) {
  33. srand(mass[i]);
  34. int j;
  35. for (j = 0; j < iter_count; j++) {
  36. int value = (int)(10 * rand() / (RAND_MAX + 1.0));
  37. int index1 = (int)(len * rand() / (RAND_MAX + 1.0));
  38. int index2 = (int)(len * rand() / (RAND_MAX + 1.0));
  39. if (index2 != index1) {
  40. struct sembuf down[2] = {{index1, -1, 0}, {index2, -1, 0}};
  41. struct sembuf up[2] = {{index1, 1, 0}, {index2, 1, 0}};
  42. semop(semid, down, 2);
  43. operation(shmaddr, index1, index2, value);
  44. semop(semid, up, 2);
  45. }
  46. }
  47. exit(0);
  48. }
  49. }
  50. int status;
  51. while(wait(&status) == -1);
  52. for (i = 0; i < len; i++) {
  53. printf("%d\n", shmaddr[i]);
  54. }
  55. free(mass);
  56. for (i = 0; i < len; i++) {
  57. semctl(semid, i, IPC_RMID, NULL);
  58. }
  59. shmctl(shmid, IPC_RMID, NULL);
  60. return 0;
  61. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement