Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Семафоры  (Прочитано 1505 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Robotex

  • Автор темы
  • Любитель
  • *
  • Сообщений: 85
    • Просмотр профиля
Семафоры
« : 28 Декабря 2008, 22:02:31 »
Изучаю межпроцессное взаимодействие. Написал простой код:
#include <iostream>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

using namespace std;

int main()
{
cout << "Hello, world!" << endl;

//создать набор из двух семафоров
int perm = S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH;
int semdesc = semget (11, 2, IPC_CREAT | perm);


return 0;
}
Выдает ошибку, что не существует констант S_IRUSR, S_IWUSR, S_IRGRP, S_IROTH

Оффлайн Rosik

  • Активист
  • *
  • Сообщений: 255
  • по жизни Rosik
    • Просмотр профиля
Re: Семафоры
« Ответ #1 : 29 Декабря 2008, 09:21:09 »
попробуйте IPC_CREAT | 0644

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Семафоры
« Ответ #2 : 29 Декабря 2008, 12:51:13 »
надо включить заголовок sys/stat.h
« Последнее редактирование: 29 Декабря 2008, 12:54:24 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн Robotex

  • Автор темы
  • Любитель
  • *
  • Сообщений: 85
    • Просмотр профиля
Re: Семафоры
« Ответ #3 : 29 Декабря 2008, 21:19:10 »
Сваял такую вещь:
#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;
}

 

Страница сгенерирована за 0.032 секунд. Запросов: 25.