У меня проблема с семафором в моем коде.
Это структура, которую я построил:
struct PipeShm
{
// doesn't matter
sem_t *mutex;
int init;
// more fields
};
Здесь я инициализирую структуру:
struct PipeShm myPipe ;
myPipe.mutex = NULL;
myPipe.init = 0;
И я использую метод инициализации:
int initMethod()
{
if (!myPipe.init)
{
myPipe.mutex = mmap (NULL, sizeof *myPipe.mutex, PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANONYMOUS, -1, 0);
if (!sem_init (myPipe.mutex, 1, 0))
{
myPipe.init = TRUE;
}
else
perror ("initMethod");
}
return 1;
}
Это простой main , который использует вышеописанное:
int main()
{
int spd, pid, rb;
char buff[4096];
shm_pipe_init();
fork();
// more code goes here
return 0;
}
В строке fork();
(пожалуйста, поправьте меня, если я ошибаюсь) процессы 2
будут иметь два разных семафора, верно?
Если это так, я хочу сделать глобальный семафор. Это возможно?
Из-за проблем с синхронизацией в моем коде подозреваю, что основная причина - двойной семафор для каждого создаваемого процесса.
2 outputs
, когда яfork
, я получаю один раз2 outputs
, а другой раз1 output
- person JAN   schedule 30.07.2012init
также внутри общего сегмента, это не может работать так. Вы должны иметь всю свою общую структуру управления в сегменте. Вы видели мой ответ, там? stackoverflow.com/questions/11708049/ - person Jens Gustedt   schedule 30.07.2012fork
. Но если процедура инициализации вызывается после вызоваfork
, вы правы в том, что флаг инициализации также должен находиться в общей памяти. - person jxh   schedule 31.07.2012