Семафор Linux, может ли процесс блокировать сам себя? - PullRequest
2 голосов
/ 16 декабря 2010

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

Но если я получаю 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);

1 Ответ

1 голос
/ 16 декабря 2010

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

  1. Инициализировать семафор 1 (su.val)

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

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

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

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

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

...