#include < stdio.h > #include < stdlib.h > #include < string.h > #include < sys/sem.h > #include < sys/shm.h > #include < sys/types.h > #include < sys/ipc.h > #include < time.h > #define SEMKEY (1492) #define SHMKEY (1493) #define SHMKEY2 (1494) int obid() { int shmid2; int * bestbid; if ((shmid2 = shmget(SHMKEY2, sizeof(int), 0666)) < 0) { exit(-1); } if ((bestbid = shmat(shmid2, NULL, 0)) == (int *) -1) { exit(-1); } if (*bestbid == -1) printf("Үнэ хаялтын шийдвэр хүлээгдэж байна.n"); while (*bestbid == -1) sleep(1); return 0; } int main(int argc, char **argv){ int n; int semid; int shmid, shmid2; pid_t pid; int retval; int i; // for iteration i.e., C99 standard struct sembuf operations[1]; int * bids, * bestbid; int semval; int rndnum; int min; int processid; if (argc < 2) { printf("Алдаа: Ажиллуулмаар байгаа процессийн тоо хэмжээг оруулаагүй байна.n"); exit(-1); } n = atoi(argv[1]); /* Semaphore */ semid = semget(SEMKEY, 1, 0666 | IPC_CREAT); if(semid < 0) { exit(-1); } union semun { int val; struct semid_ds *buf; ushort * array; } argument; argument.val = n; if( semctl(semid, 0, SETVAL, argument) < 0) { printf("Алдаа: Сэмафорын утгыг өгч чадсангүй.\n"); exit(-1); } /* Shared memory for bids */ if ((shmid = shmget(SHMKEY, n*sizeof(int), IPC_CREAT | 0666)) < 0) { exit(-1); } if ((bids = shmat(shmid, NULL, 0)) == (int *) -1) { exit(-1); } /* Shared memory for the minimum bid */ if ((shmid2 = shmget(SHMKEY2, sizeof(int), IPC_CREAT | 0666)) < 0) { exit(-1); } if ((bestbid = shmat(shmid2, NULL, 0)) == (int *) -1) { exit(-1); } *bestbid = -1; for (i=0; i < n; i++) { pid = fork(); if (pid < 0) { printf("Алдаа: Хүүхэд процесс үүсгэхэд алдаа гарлаа.\n"); } else if (pid == 0) { //child process processid = i; semval = semctl(semid, 0, GETVAL, argument); rndnum = (abs((getpid() * rand())) % 1000) + 10; *(bids+semval) = rndnum; printf("Процесс #%d: %d MNT Үнэ санал болголоо. ", i, rndnum); operations[0].sem_num = 0; operations[0].sem_op = -1; operations[0].sem_flg = 0; if (semval == 1) { printf("Шийдвэр хүлээгдэж байна.\n"); min = *(bids+i); for(i=1; i <= n; i++) { if (min > *(bids+i+1) & i+1 <= n) { min = *(bids+i+1); } } *bestbid= min; printf("Хамгийн бага үнийн санал: %d MNT. obid функцд хүлээгдэж байсан процессууд ажилна.\n", *bestbid); } retval = semop(semid, operations, 1); if(retval == 0) { if (obid() == 0) { printf("Процесс #%d: obid функцээс буцлаа. \n", processid); } exit(0); } } else { //parent process if (semctl(semid, 0, GETVAL, argument) == 0) { semctl(semid,0,IPC_RMID,0); shmctl(shmid,IPC_RMID,0); shmctl(shmid2,IPC_RMID,0); exit(0); } } } printf("n"); return 0; }
2009-08-10
Процесс хоорондын харилцаа буюу IPC
Subscribe to:
Post Comments (Atom)
ажиллаж байна кодыг жаахан тайлбар бичвэл зүгээр л байна :)
ReplyDelete