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


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Семафоры для межпрограммного взаимодействия  (Прочитано 1486 раз)

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

Оффлайн Voronar

  • Автор темы
  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Здравствуйте, уважаемые форумчане.

Передо мной стоит следующая задача:
Первая программа формирует специальный пакет и отправляет его по сети не важно куда.
Вторая программа должна в процессе выполнения первой менять содержимое пакета первой программы по моему запросу.
Решил воспользоваться shmget для использования общей памяти, а для синхронизации программ(потоков(процессов)) semget семафорами.
С последними не могу разобраться.

Хочу реализовать следующую логику:
Запускается первая программа, формируется пакет, создается общий семафор с изначальным положительным значением и начинается циклическая отправка пакета. В это время я запуская вторую программу, ставлю семафор в отрицательное значение(первая программа останавливается) и меняю содержимое пакета из общей с первой программой памяти. После этого переключаю семафор на положительное значение и первая программа продолжает передачу пакета.

Вот примерный код для семафора в первой программе:

//собрали пакет

sembuf buf;
key = ftok(FTOK_FILE, 1);
semid = semget(key, 1, 0666|IPC_CREAT);

buf.sem_op = 1;
semop(semid, (struct sembuf*) buf, 1);

//начинаем отправку

Вот примерный код для семафора во второй программе:

sembuf buf;
key = ftok(FTOK_FILE, 1);
semid = semget(key, 1, 0666);

buf.sem_op = -1;
semop(semid, (struct sembuf*) buf, 1); //останавливаем первую программу

//изменяем содержимое пакета

buf.sem_op = 1;
semop(semid, (struct sembuf*) buf, 1); //передача возобновляется

Не пойму вот что:
Я создаю семафор именно для процесса первой программы и остановится именно она?
Ещё вопрос про 2 семафора. Если я создам 2 семафора, то как привязать конкретный семафор к конкретной программе? Как это указывается в коде?

Заранее благодарен.
« Последнее редактирование: 06 Июня 2013, 17:09:29 от Чистый »

Оффлайн Чистый

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3473
  • nix - вот оно счастье...
    • Просмотр профиля
у семафора есть имя вот через это имя и взаимодействуйте
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

Оффлайн Чистый

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3473
  • nix - вот оно счастье...
    • Просмотр профиля
для синхронизации процессов лучше использовать sem_open() sem_wait и т.п.
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

Оффлайн Voronar

  • Автор темы
  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
А если я создаю массив(5) семафоров (semid = semget(key, 5, 0666|IPC_CREAT);), то какой из них к какой программе относится? Как это задается, как это определить?

Я думаю, что sem_wait и sem_post не подойдут в моем случае. Ведь при запуске sem_wait семафор останавливает тот процесс, который его запустил. А у меня две разные программы. Я поэтому и решил воспользоваться семафором с общим ключом.

Оффлайн Чистый

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3473
  • nix - вот оно счастье...
    • Просмотр профиля
sem_wait останавливает тот процесс который ему указали :)
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

Оффлайн Voronar

  • Автор темы
  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
В мануале по-другому написано. http://home.agalakov.spb.ru/Shared/Documentation/Programming/IIAS/Os2k/os2000/doc/function/sem_wait.htm

Вопрос остается открытым. в идеале бы хотелось наглядного примера.)

Оффлайн _XDD_

  • Участник
  • *
  • Сообщений: 108
    • Просмотр профиля
Voronar,
семафор не привязывается к конкретной программе.

Просто блокируется процесс, пытающийся изменить значение семафора в отрицательное до того момента, пока значение семафора не станет достаточным для выполнения вычитания значения.

пример:
значение семафора = 1

процесс 1 пытается выполнить: семафор -2, что дает отрицательный результат и блокируется.
процесс 2 пытается выполнить: семафор +1, и значение семафора становится равным 2.
процесс 1 теперь может выполнить условие (семафор-2 > 0) и разблокируется.

справедливо и обратное.

 

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