Синхронизация процессов linux - семафоры

программирование Linux ОС

у меня что то не получается за синхронизировать 4 процесса, тоесть я хочу чтобы выводила 1,2,3,4 а оно выводит 3,1,2

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/types.h>

#define KEY 1147
#define KEY2 1148
#define KEY3 1149


int main(void)
{
pid_t a;
pid_t b;
int semid,semid2,semid3;
struct sembuf sem_wait[2] = { {0, -1, 0}, {0, 1, 0} };
struct sembuf sem_wait2[2] = { {0, -1, 0}, {0, 1, 0} };
struct sembuf sem_wait3[2] = { {0, -1, 0}, {0, 1, 0} };

if( (semid = semget(KEY, 2, 0666 | IPC_CREAT)) < 0)
{
perror("semget");
return -1;
}
if( (semid2 = semget(KEY2, 2, 0666 | IPC_CREAT)) < 0)
{
perror("semget");
return -1;
}

if( (semid3 = semget(KEY3, 2, 0666 | IPC_CREAT)) < 0)
{
perror("semget");
return -1;
}

if( (a = fork()) && (b = fork())< 0)
{
perror("fork");
return -1;
}


//-------------------------------------------
if(a==0 && b>0)
{
semop(semid2, &sem_wait2[0], 1);
printf("3\n");
semop(semid3, &sem_wait3[1], 1);
}
if(a==0 && b==0)
{
semop(semid3, &sem_wait3[0], 1);
printf("4\n");
}
if(a>0 && b==0)
{
semop(semid, &sem_wait[0], 1);
printf("2\n");
semop(semid2, &sem_wait2[1], 1);
}
if(a> 0 && b> 0)
{
printf("1\n");
semop(semid, &sem_wait[1], 1);
}

return 0;
}
Ответы:
Семафоры System V — редкостная пакость. Вместо них в большинстве случаев удобнее использовать семафоры POSIX, да вот беда, про них большинство и не слышали.


15 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.