2013-12-15 3 views
-2

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

Я использую мьютекс для управления доступом к определенной зоне, потому что у меня есть 2 процесса, которые должны читать/записывать из этой зоны. Дело в том, что, когда мы используем fork() для создания нового дочернего процесса, вся программа «копируется» в другую программу, как если бы они были двумя отдельными программами? поэтому, когда я делаю V (mutex) в одном процессе, как другой знает, что он не может получить доступ?

Я знаю его вопрос о нобе, но до сих пор никто не мог объяснить это мне.

+0

Вы также можете синхронизировать связь через добрый старый IPC. –

ответ

0

Объекты синхронизации должны быть размещены в общей памяти общего пользования, например, созданной с помощью mmap (... MAP_ANONYMOUS ...). Кроме того, они должны иметь набор атрибутов PTHREAD_PROCESS_SHARED, например, используя pthread_mutexattr_setpshared.

+0

, так что вы говорите, что когда я создаю свой shmid, я должен атаковать семафор? –

+0

Если вы используете разделяемую память и семафоры System V, вам не нужно ничего особенного делать. – chill

+0

А нит, но OP не может использовать pthreads. Аналогичное использование для PROCESS_SHARED для posix-семафоров было бы вторым parm (pshared) в 'sem_init'. – Duck

2

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

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

0

Смотрите здесь:

Semaphores and Mutex for Thread and Process Synchronization

Так мьютекс на практике часто используется в потоках, что делает обмен тривиальным. Однако для процессов мьютекс может храниться как часть общего mem.

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

http://beej.us/guide/bgipc/output/html/multipage/semaphores.html

Или вы можете использовать другой IPC для синхронизации. Сигналы, например.

Надеюсь, это поможет.

+0

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

+0

На самом деле нет. Клавиша общей памяти должна быть неактуальна для общего ключа mem, но разные процессы должны использовать одни и те же ключи для семафора. Вы можете обратиться к примерам по ссылке выше. Итак, для вашего примера может быть один ключ для shared mem и один для семафора. Они не должны быть одинаковыми. – OLDGUN

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