【问题标题】:Why does semop(semid,&wait[1],2); on a set of three semaphores decreases the value of 0th semaphore instead of 1st and 2nd semaphore?为什么 semop(semid,&wait[1],2);在一组三个信号量上减少第 0 个信号量而不是第 1 个和第 2 个信号量的值?
【发布时间】:2011-06-30 18:58:40
【问题描述】:

我有一个代码,我正在处理一组 3 个信号量。我有两套 struct sembuf wait[3],signal[3];

我已经初始化了它们中的每一个。 wait初始化为-1,signal初始化为1

然后我使用函数semctl(semid,0,SETALL,2); 将它们的值设置为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

【问题讨论】:

    标签: c linux unix operating-system semaphore


    【解决方案1】:

    您在所有参数中都使用了 sem_num=0。

    【讨论】:

    • @B Mitch:非常感谢。非常感谢您指出这个愚蠢的错误。
    猜你喜欢
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多