Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
- #include <string.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/wait.h>
- #include <sys/shm.h>
- #include <unistd.h>
- int main(int argc, char **argv)
- {
- int semid, shmid, key;
- int *shmaddr;
- int nproc, len, iter_count;
- len = atoi(argv[1]);
- key = atoi(argv[2]);
- nproc = atoi(argv[3]);
- iter_count = atoi(argv[4]);
- semid = semget(key, len, 0666 | IPC_CREAT);
- shmid = shmget(key, sizeof(shmaddr[0]) * len, 0666 | IPC_CREAT);
- shmaddr = (int *)shmat(shmid, NULL, 0);
- int *mass = malloc(sizeof(int) * nproc);
- int i;
- for (i = 0; i < nproc; i++) {
- mass[i] = atoi(argv[5 + i]);
- }
- for (i = 0;i < len; i++) {
- scanf("%d", &shmaddr[i]);
- }
- for (i = 0; i < nproc; i++) {
- if (!fork()) {
- srand(mass[i]);
- int j;
- for (j = 0; j < iter_count; j++) {
- int value = (int)(10 * rand() / (RAND_MAX + 1.0));
- int index1 = (int)(len * rand() / (RAND_MAX + 1.0));
- int index2 = (int)(len * rand() / (RAND_MAX + 1.0));
- if (index2 != index1) {
- struct sembuf down[2] = {{index1, -1, 0}, {index2, -1, 0}};
- struct sembuf up[2] = {{index1, 1, 0}, {index2, 1, 0}};
- semop(semid, down, 2);
- operation(shmaddr, index1, index2, value);
- semop(semid, up, 2);
- }
- }
- exit(0);
- }
- }
- int status;
- while(wait(&status) == -1);
- for (i = 0; i < len; i++) {
- printf("%d\n", shmaddr[i]);
- }
- free(mass);
- for (i = 0; i < len; i++) {
- semctl(semid, i, IPC_RMID, NULL);
- }
- shmctl(shmid, IPC_RMID, NULL);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement