Я проверял это, и фактически серверный процесс запускается первым (StockExchangeServer::start2
), но проблема в
while(*shm == 0) {
sleep(1);
}
Это приводит к бесконечному циклу, и вы не можете StockExchangeClient::start2()
изменить *shm
, поскольку родитель ожидает неопределенно в sem_wait
, так как ребенок никогда не выполнял sem_post
Вместо этого можно сделать sem_post
перед входом в цикл в StockExchangeServer::start2
, чтобы вы освободили родителя от его sem_wait
. Для этого вам необходимо отправить &sem
на StockExchangeServer::start2
. Может быть, изменив его прототип на что-то вроде StockExchangeServer::start2( sem_t *sem )
.
Но поскольку sem
является безымянным семафором , существует 2 копии, одна на родительском и одна на дочернем, и если вы хотите, чтобы его использовали и родительский, и дочерний, вам необходимо создать его в область общей памяти, используя shmget
, а затем доступ к ней через процессы. Если вам не нужна вся эта боль, вы можете переключиться на именованные семафоры , к которым могут обращаться даже не связанные процессы. Короче говоря, безымянные семафоры обычно используются для потоков (поскольку потоки совместно используют данные) и именованные семафоры для процессов.
Также, как заметил Дэвид Шварц в комментариях, убедитесь, что вы предотвращаете непреднамеренную оптимизацию цикла while
. Например, перед циклом выведите значение shm
.