Понимание posix межпроцессного семафора - PullRequest
3 голосов
/ 28 июля 2011

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

#include <iostream>
#include <semaphore.h>
#include <sys/wait.h>

using namespace std;

static int MAX = 100;

int main(int argc, char* argv[]) {
  int retval;
  sem_t mutex;

  cout << sem_init(&mutex, 1, 0) << endl;

  pid_t pid = fork();

  if (0 == pid) {
    //     sem_wait(&mutex);
    cout << endl;
    for (int i = 0; i < MAX; i++) {
      cout << i << ",";
    }
    cout << endl;
    sem_post(&mutex);

  } else if(pid > 0) {
    sem_wait(&mutex);
    cout << endl;
    for (int i = 0; i < MAX; i++) {
      cout << i << ",";
    }
    cout << endl;
    //     sem_post(&mutex);
    wait(&retval);

  } else {
    cerr << "fork error" << endl;
    return 1;
  }

//   sem_destroy(&mutex);

  return 0;
}

Когда я запускаю это в Gentoo / Ubuntu Linux, родитель зависает. Судя по всему, он не получил пост ребенка. Раскомментирование sem_destroy не поможет. Я что-то упустил?

Обновление 1: Этот код работает

mutex = (sem_t *) mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, 0, 0);
if (!mutex) {
  perror("out of memory\n");
  exit(1);
}

Спасибо, Nilesh.

Ответы [ 2 ]

5 голосов
/ 28 июля 2011

Формулировка на странице руководства выглядит неоднозначно.

Если pshared не равен нулю, то семафор разделяется между процессами, и должен находиться вобласть общей памяти .

Поскольку дочерний объект, созданный fork (2), наследует отображения памяти своего родителя, он также может получить доступ к семафору.

Да, но это все еще должно быть в общей области .В противном случае память просто копируется с обычным CoW , и все.

Вы можете решить это по крайней мере двумя способами:

  • Использовать sem_open("my_sem", ...)
  • Используйте shm_open и mmap для создания общего региона
2 голосов
/ 12 февраля 2013

Отличная статья на эту тему, для будущих прохожих:

http://blog.superpat.com/2010/07/14/semaphores-on-linux-sem_init-vs-sem_open/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...