Я пытаюсь решить школьную проблему, включающую семафоры 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), и программа работала как задумано. Что мне здесь не хватает?