Странное поведение семафора POSIX (зависание на sem_wait в Linux) - PullRequest
1 голос
/ 12 октября 2019

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

sem_t sem;

void parent() {
    printf("waiting...\n");
    sem_wait(&sem);
    printf("done!\n");
}

void child() {
    sem_post(&sem);
    printf("go!\n");
    exit(0);
}

int main() {
    sem_init(&sem, 1, 0);

    if(!fork())
        child();

    parent();

    sem_destroy(&sem);

    exit(0);
}

При компиляции (используя gcc -Wall -pthread sems.c -o sems) и запуске этой программы в Linux я получаю следующий вывод (программане завершает выполнение):

waiting... 
go!

Поскольку я вызываю sem_post(&sem) в дочернем процессе, я ожидаю, что родительский процесс переместится за sem_wait(&sem), а результат будет:

waiting...
go!
done!

Еще более странно, из любопытства, я попытался протестировать его на Windows с помощью CLion (компилятор Cygwin), и программа работала как задумано. Что мне здесь не хватает?

1 Ответ

0 голосов
/ 12 октября 2019

На справочной странице в sem_init():

Если pshared не равен нулю, то семафор разделяется между процессами и должен располагаться в области общей памяти(см. shm_open (3), mmap (2) и shmget (2)). (Так как дочерний объект, созданный fork (2), наследует отображения памяти своего родителя, он также может получить доступ к семафору.)

Ваша переменная sem не размещена в разделяемой памяти;поэтому его нельзя разделить между процессами, несмотря на ненулевой аргумент pshared. Каждый процесс имеет свой уникальный экземпляр семафора.

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