2010-12-16 3 views
2

Я использую semget(), чтобы получить семафор, и инициализировать его VAL до 0, тогда я хочу ждать его с помощью semop(), но он напрямую возвращается. (Другой процесс разработан, чтобы получить SEM и освободить его после некоторых операций)linux семафор, может сам процесс блокировать?

Но если я получаю SEM и инициализирую его VAL до 0 в процессе и жду его в другом процессе, он работает.

Означает ли это, что процесс не может блокировать себя?

спасибо !!!

так:

int semid = semget(IPC_PRIVATE, 1, IPC_CREAT); 
union semun su; 
su.val = 0; 
semctl(semid, 1, SETVAL, su); 
struct sembuf sb; 
sb.sem_num = 0; 
sb.sem_op = -1; 
sb.sem_flg = 0; 
semop(semid, &sb, 1); 
+0

Как создать семафор? можете ли вы показать какой-то код? – Simone 2010-12-16 08:13:23

ответ

1

Насколько я могу видеть в данный момент вы должны:

  1. Присвоить семафора 1 (su.val)

  2. Вызов semop с sb.sem_op установлено в 0 (т.е. ждать, пока счетчик не упадет до нуля).

  3. Оставьте счетчик в другом процессе (sem_op = -1).

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

Возможно, это может дать дополнительные сведения:

http://linuxdevcenter.com/pub/a/linux/2007/05/24/semaphores-in-linux.html?page=2

+0

спасибо !! оно работает!! но я все еще запутался, почему инициализация su.val до 0 может блокировать другой процесс. С другой стороны, как может процесс блокировать себя. Я новичок в * nix. еще раз спасибо за вашу помощь и веб-документы. – chinfoo 2010-12-16 09:42:53

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