#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;
}