LINUX.ORG.RU

Сообщения vladzakharov97

 

Использовать семафоры для взаимного исключения

Форум — Development

Добрый день, подскажите что в этой программе не так?(нужно использовать семафоры для взаимного исключения)


#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <errno.h>
#include <sys/sem.h>

const int INC_DEC = 500000;

int main() {

int shmid = 777,semid;
int *array;
char pathName[] = "program6_2_7.c";
int var = 0;
int new=1;
key_t key;
struct sembuf mybuf;
if ((key = ftok(pathName,0)) < 0)
 {
  printf("can't generate key\n");
  return -1;
 }

if ((shmid = shmget(key, 1*sizeof(int), 0666 | IPC_CREAT | IPC_EXCL))< 0)
 {
  if (errno != EEXIST)
  {
  printf("Cant create shared memory1\n");
  exit(-1);
  }
else
   {
    if ((shmid = shmget(key, 1*sizeof(int),0))< 0)
    {
    printf("Cant create shared memory2\n");
    exit(-1);
    }
   }
  if ((array = (int*)shmat(shmid, NULL,0)) == (int*)(-1))
  {
  printf("Cant attach shared memory\n");
  exit(-1);
  }
 }

semid = semget(key,1,0666 | IPC_CREAT);
mybuf.sem_op = 0;
mybuf.sem_flg = 0;
mybuf.sem_num = 0;
array[0] = var;
int f = fork();

if (f > 0)
  {
  semop(semid, &mybuf,1);
  for (int i = 0; i < INC_DEC; ++i)
    {
    array[0]-=1;
    mybuf.sem_op=-1;
    semop(semid, &mybuf,1);
    }
  printf("Parent dec var = %d", array[0]);
  }
else
  {
  semop(semid, &mybuf,1);
  for (int i = 0; i < INC_DEC; ++i)
   {
   array[0]+=1;
   mybuf.sem_op=1;
   semop(semid, &mybuf,1);
   }
  printf("Child inc var = %d",array[0]);
  }
return 0;
}

 

vladzakharov97
()

RSS подписка на новые темы