2013-04-16 4 views
0

Я полагал, что моя программа должна работать так: 1) инициализирует неназванный семафора со значением = 0 второе значение для sem_init (..) 1 так, как это сказано в MAN семафор разделяемой между процессами 2) создание ребенка, ребенок ждет, пока значение семафора не станет 1семафор беда POSIX

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

#include <stdlib.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <semaphore.h> 


pid_t child; 


void child_proc(sem_t* sem) { 
    sem_wait(sem); 
    printf("OK\n"); 
} 

void parent_proc(sem_t* sem) { 

    sem_post(sem); 
    sleep(2); 

    int status; 
    waitpid(child, &status, 0); 
} 

int main(int argc, char* argv[]) { 
    sem_t sem; 
    sem_init(&sem, 1, 0); 

    child = fork(); 

    if (0 == child) { 
     child_proc(&sem); 
     return 0; 
    } 

    parent_proc(&sem); 
    return 0; 
} 

ответ

1

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

Как the man page also says, если вы хотите поделиться семафоры между процессами, а не только вам нужно передать ненулевое значение второго аргумента sem_init, но sem_t структура также должна существовать в области общей памяти. В вашей примерной программе он существует в стеке, который не используется совместно.

Вы можете иметь общую память, используя общее сопоставление файлов (с mmap) или с shm_open, в частности.

+0

Должен ли я использовать собственный блок памяти для себя и положить sem_t в него? – NinjaTurtle

+0

@NinjaTurtle, да, это в значительной степени то, что вам нужно делать. – zneak

+0

Хорошо, после этого у меня есть еще одна проблема: человек говорит, что (http://man7.org/linux/man-pages/man2/msync.2.html) общие данные должны обновляться после каждого изменения, поэтому мне нужно для вызова «msync()» после каждого действия семафора, да? :( – NinjaTurtle

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