2013-12-21 3 views
0

Все, я здесь, чтобы спросить вас Как я могу поделиться массивом семафоров между двумя процессами?? Поскольку я создал массив с semget(..), но я не могу использовать shmat(..) на нем!Поделиться массивом Семафоры между двумя процессами | linux C

С разделом общей памяти я обычно использую shmget(), а затем shmat(..), чтобы дочерний процесс мог получить к нему доступ. Но как это работает с массивом семафоров?

Я не могу найти какой-либо подобный метод, способный прикрепить() !!!

Здесь Пользуюсь semget() создать массив из 5 семафоров:

/* allocate semaphores */ 
    if ((semid = semget(IPC_PRIVATE,5,IPC_CREAT|0666)) == -1) { 
     printf("shmget() fallita sem id\n"); 
     perror("semget()"); 
     //releaseAll(bufferid,Tid,Did,semid); 
     exit(-4); 

Вот в другом процессе, я пытаюсь прикрепить этот массив перед использованием его (но я использую шмат и, кажется, не работает ..)

sem_t* addr1; 

    if((addr1=(sem_t*)shmat(semid,NULL,0))==-1){ 
     printf("shmat() fallita sem id\n"); 
     perror("shmat() for content"); 

     exit(-1);// +1 per \0 finale 
    } 
+1

Вам не нужна общая память. Просто не используйте 'IPC_PRIVATE', используйте реальный ключ, возвращенный' ftok' вместо этого в обоих процессах. См. [Здесь] (http://pubs.opengroup.org/onlinepubs/009695299/functions/semget.html). –

ответ

3

Существует два вида семафоров, доступных на linux: sysV и POSIX. Вы используете семафоры sysV.

Семафоры sysV поддерживаются в ядре, поэтому вам не нужно выделять пространство для них или помещать их в общую память для их совместного использования. Но вам нужен способ для каждого процесса, используя их в найти им. Механизм для этого - key_t.

Функция ftok принимает имя пути и идентификатор и возвращает key_t. Это позволяет каждому процессу определять правильный путь и идентификатор для создания того же key_t.

semget принимает сгенерированный key_t, количество запрошенных семафоров и некоторые флаги разрешений и возвращает идентификатор семафора, то есть semid. Полуд используется во всех последующих вызовах semctl и semop.

Альтернатива, когда вам не нужна доли идентичности семафора с другими процессами является вызов semget с IPC_PRIVATE вместо генерируемого key_t. Вы неявно подтверждаете использование IPC_PRIVATE, что никакие несвязанные процессы не должны знать возвращенный semid и, таким образом, получить доступ к семафору. Это полезно для отдельных процессов с несколькими потоками, которые совместно используют память и, следовательно, semid; или для связанных процессов, которые создают семафоры перед форкированием, но совместно используют копию полудрада после вилки.

Итак, ваша проблема заключается в том, что у вас есть два несвязанных процесса, которым необходимо поделиться некоторыми семафорами. Для этого вам нужно использовать механизм ftok для генерации ключа, чтобы все участники могли их найти.

+0

Что произойдет, если я хочу использовать IPc-Private, и я попытаюсь выполнить некоторую операцию над массивом direclty с помощью Id? Он работает или мне нужно использовать ftok? Зачем? – user244050

+0

Я возвращаю свой предыдущий комментарий. Я так не думаю. Второй процесс все равно должен был бы вызвать 'semget' для установления разрешений, поэтому даже если вы можете передать ему' semid', он должен завершиться неудачей с EACCES, если он попытается использовать 'semop' или' semctl'.И если он сам назвал 'semget' с IPC_PRIVATE, он просто получил бы другой' semid' и не разделил бы существующий семафор. – Duck

Смежные вопросы