Почему semop (semid, & wait [1], 2);на множестве из трех семафоров уменьшается значение 0-го семафора вместо 1-го и 2-го семафора? - PullRequest
0 голосов
/ 20 февраля 2011

У меня есть код, где я работаю над набором из 3 семафоров. У меня есть два комплекта struct sembuf wait[3],signal[3];

Я инициализировал каждый из них. Ожидание инициализируется до -1, а сигнал инициализируется до 1

Затем я устанавливаю их значения как 2, используя функцию semctl(semid,0,SETALL,2);, которая успешно работает. Затем я проверяю, установлены ли их значения и установлены ли они.

Тогда я делаю semop(semid,&wait[1],2);. это должно подождать оба семафора и уменьшить их значения. Поэтому я ожидаю, что к этому времени значения трех семафоров будут равны 2,1,1, но, к моему удивлению, он уменьшил значение первого семафора в два раза, и я вижу значения как 0,2,2.

Может кто-нибудь сказать мне, почему это происходит.

Вот мой код:

#include<stdio.h>
#include<stdlib.h>
#include<sys/sem.h>
#include<sys/ipc.h>
#include<sys/types.h>
#include<string.h>
#include<errno.h>

int main(int argc,char *argv[]){

    key_t key1 = 12345;
    int semid;
    unsigned short *semval;

    struct sembuf wait[3],signal[3];
    semval = (unsigned short*) malloc(sizeof(unsigned short) * 3);

    wait[0].sem_num = 0;
    wait[0].sem_op = -1;
    wait[0].sem_flg = SEM_UNDO;

    signal[0].sem_num = 0;
    signal[0].sem_op = 1;
    signal[0].sem_flg = SEM_UNDO;

    wait[1].sem_num = 0;
    wait[1].sem_op = -1;
    wait[1].sem_flg = SEM_UNDO;

    signal[1].sem_num = 0;
    signal[1].sem_op = 1;
    signal[1].sem_flg = SEM_UNDO;

    wait[2].sem_num = 0;
    wait[2].sem_op = -1;
    wait[2].sem_flg = SEM_UNDO;

    signal[2].sem_num = 0;
    signal[2].sem_op = 1;
    signal[2].sem_flg = SEM_UNDO;

    semid = semget(key1,3,IPC_CREAT);
    printf("ALLOCATING THE SEMAPHORES = %s\n",strerror(errno));

    semval[0] = semval[1] = semval[2] = 2;
    semctl(semid,0,SETALL,semval);
    printf("SETTING SEMAPHORE VALUES = %s\n",strerror(errno));

    semctl(semid,0,GETALL,semval);
    printf("Initialized Semaphore values : %d--%d--%d\n",semval[0],semval[1],semval[2]);

    semop(semid,&wait[1],2);
    printf("WAITING ON SEMAPHORES 2 AND 3 = %s\n",strerror(errno));

    semctl(semid,0,GETALL,semval);
    printf("VALUES AFTER WAITING ON SEMAPHORES 2 AND 3 : %d--%d--%d\n",semval[0],semval[1],semval[2]);

    semctl(semid,0,IPC_RMID);
    printf("SEMAPHORE REMOVED = %s\n",strerror(errno));
    return 0;
}

и вот вывод

anirudh@anirudh-Aspire-5920:~/Desktop/testing$ gcc -g -o sem3 sem3.c
anirudh@anirudh-Aspire-5920:~/Desktop/testing$ sudo ./sem3
ALLOCATING THE SEMAPHORES = Success
SETTING SEMAPHORE VALUES = Success
Initialized Semaphore values : 2--2--2
WAITING ON SEMAPHORES 2 AND 3 = Success
VALUES AFTER WAITING ON SEMAPHORES 2 AND 3 : 0--2--2
SEMAPHORE REMOVED = Success

Наконец-то удалось написать блог об этом. http://systemsdaemon.blogspot.com/2011/02/system-v-semaphores-for-babies.html

1 Ответ

4 голосов
/ 20 февраля 2011

Вы использовали sem_num = 0 во всех ваших параметрах.

...