为什么不能与我创建的System V信号灯交互?

问题描述 投票:0回答:1

我正在尝试在C语言中使用System V信号量进行实验,但我的课程没有帮助。

我可以创建我的信号量并将其删除(使用semget()和semctl()),但是我无法与其进行交互:它的值始终保持不变(0),并且在我执行信号量工作时不会起作用要求(使用semop())。

顺便说一下,我从下面已经提取的有关信号量的代码中提取了代码:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

int main()
{
    // some code

    int sem;

    struct sembuf up = {0,1,0};
    struct sembuf down = {0,-1,0};

    sem = semget(IPC_PRIVATE, 1, 777 | IPC_CREAT);
       // Tried with 777 because why not. Originally at 600
       // but it gave me a "Permission denied" error.

    semop(sem, &up, 1); // up

    // some critical code

    semop(sem, &down, 1); // ... and down
    semctl(sem, 0, IPC_RMID); // deletion
}

有人知道我的代码中缺少什么来使我的信号灯正常工作吗?

NB:不,我不能使用POSIX信号量。是的,我知道这很可悲。

c ipc semaphore sysv-ipc
1个回答
2
投票

semget()函数返回的内容不是“信号量”,它是信号量集的ID(或者,在您的情况下,是单个信号量,因为您正在创建大小为1的集合)。该set id将保持为0,并且不会改变,无论sempahore本身发生了什么-在程序中都不会将其保存为变量。

与信号量的交互仅通过semop()semctl()函数(可能还有semtimedop()。例如,如果我们有:

union semun  
{
    int val;
    struct semid_ds *buf;
    ushort array [1];
} sem_attr;
int result;

定义,我们可以写:

sem_attr.val = 1;
result = semctl (semaphore_set_index, 0, SETVAL, sem_attr);
if (result == -1) { /* handle error here */ }

将信号量值设置为1。


注意:

  • 我忽略了您对clang与其他编译器的引用。
  • 按照@ThomasJager的建议-总是检查API调用返回值是否有错误。
  • 我将这个答案部分地基于本文:

    System V Sempaphores in Linux

© www.soinside.com 2019 - 2024. All rights reserved.