Сваял такую вещь:
#include <iostream>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
using namespace std;
int get_sem_val( int sid, int semnum )
{
return( semctl(sid, semnum, GETVAL, 0));
}
int main()
{
char pathname[] = "main.cxx"; /* Имя файла,
использующееся для генерации ключа. */
key_t key; /* IPC ключ */
struct sembuf mybuf; /* Структура для задания
операции над семафором */
/* Генерируем IPC-ключ из имени файла main.cxx в текущей
директории и номера экземпляра массива семафоров 0 */
if((key = ftok(pathname,0)) < 0)
{
cout << "Невозможно сгенерировать ключ" << endl;
exit(-1);
}
int semdesc = semget (key, 1, IPC_CREAT | 0666);
if(semdesc < 0)
{
cout << "Невозможно открыть набор" << endl;
exit(-1);
}
cout << "Текущее значение семафора: " << get_sem_val(semdesc, 0) << endl;
cout << "Увеличиваем значение семафора" << endl;
mybuf.sem_num = 0;
mybuf.sem_op = +1;
mybuf.sem_flg = 0;
if(semop (semdesc, &mybuf, 1) < 0)
{
cout << "Невозможно увеличить значение семафора" << endl;
exit(-1);
}
int value = get_sem_val(semdesc, 0);
cout << "Новое значение семафора: " << value << endl;
cout << "Ожидаем запуска второго процесса" << endl;
while(get_sem_val(semdesc, 0) == value);
cout << "Второй процесс запущен" << endl;
cout << "Синхронно выполняем некоторую операцию" << endl;
cout << "Уменьшаем значение семафора" << endl;
mybuf.sem_num = 0;
mybuf.sem_op = -1;
mybuf.sem_flg = 0;
if(semop (semdesc, &mybuf, 1) < 0)
{
mybuf.sem_num = 0;
mybuf.sem_op = 0;
mybuf.sem_flg = 0;
if(semop (semdesc, &mybuf, 1) < 0)
{
cout << "Невозможно уменьшить значение семафора" << endl;
exit(-1);
}
}
cout << "Текущее значение семафора: " << get_sem_val(semdesc, 0) << endl;
return 0;
}