Имя и Безымянный Семафор

Я пытаюсь понять сходства и различия между именованным и безымянным семафором, поэтому мои поиски в Google дали мнеэто, У меня был вопрос по поводу формулировки на странице, хотя, он говорит:

Неназванные семафоры могут бытьгодный к употреблению более чем одним процессомИменованные семафорысовместный доступ несколькими процессами

Создают ли эти два слова какое-либо важное различие между этими двумя типами семафоров или они не имеют значения?

Итак, вот что у меня есть:

Similarities
    -Several processes can do something with the semaphore

Difference
    -Named are referenced with pathname and unnamed are referenced by pshared value

Это все, что я могу почерпнуть из этого определения. Это все и правильно ли они? Или я упускаю какую-то значимую концепцию?

Ответы на вопрос(3)

Именованный семафор имеетactual name вfile system и может бытьshared по несколькимнесвязанные процессы.

Безымянный семафор может использоваться толькоthreads принадлежность ктот же процесс.

семафоры находятсясозданный используя функцию

                 sem init(ptr_semaphore, flag, initial_value);

где

ptr_semaphore: указатель на семафор

флаг: флаг, указывающий уровень общего доступа

Начальное значение: начальное значение семафоров

Если вы пройдетеflag=0 вsem_init() тогдасемафор может бытьделится только с потоками, принадлежащими процессу который создал семафор. Таким образом, он создастбезымянный семафор.

          sem_init(ptr_semaphore,0,initial_value)   //unamed semaphore

Проходяненулевое значение было быallow другие процессы для доступа к семафору, а также, Таким образом, это приведет кименованный семафор.

          sem_init(ptr_semaphore,1,initial_value)   //named semaphore
 aaa9021013 апр. 2017 г., 01:27
«Безымянный семафор может использоваться только потоками, принадлежащими к одному и тому же процессу», - неправильно.
Решение Вопроса

кто может получить доступ к семафору.

Неназванные семафоры (без какого-либо имени или дескриптора для их поиска) должны существовать в некотором ранее существовавшем согласованном месте памяти. Обычно это (1) разделяемая память (наследуется детьми послеforkв случае дочерних процессов; или (2) разделяемая память, глобальная переменная или куча в случае, когда они совместно используются потоками одного процесса. Здесь важно то, что код в родительском, дочернем или потоковом уже знает адрес семафора.

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

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

как и другой, заданный @electron). Безымянный семафор POSIXМожно использоваться несвязанными процессами. Вам просто нужно сохранить структуру данных в разделяемой памяти, доступной для соответствующих процессов, и инициализировать ее с установленным для общего флага, как показано здесь (бесстыдно скопировано изhttp://blog.superpat.com/2010/07/14/semaphores-on-linux-sem_init-vs-sem_open/):

int shm;
sem_t * mutex;

if ((shm = shm_open("myshm", O_RDWR | O_CREAT, S_IRWXU))   0) {
    perror("shm_open");
    exit(1);
}

if (ftruncate(shm, sizeof(sem_t)) < 0 ) {
    perror("ftruncate");
    exit(1);
}

if ((mutex = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_SHARED, shm, 0)) == MAP_FAILED) {
    perror("mmap");
    exit(1);
}

if (sem_init(mutex, 1, 1) < 0) {
    perror("semaphore initialization");
    exit(1);
}

Другой процесс, отображающий общую память в свое адресное пространство, может обращаться к тому же семафору и синхронизироваться с исходным процессом. Смотрите также спецификацию POSIXsem_init () и этоСтраница man linux.

Ваш ответ на вопрос