c - semclt 总是返回 -1

标签 c linux semaphore systems-programming

我正在尝试学习使用信号量。我想要做的是初始化一个信号量。然后将其值设置为 1,获取该值并打印出来。但每次我尝试这样做时,它都会显示 -1。我的代码如下。提前致谢。

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <sys/ipc.h>
#include <sys/sem.h>

union semun {
    int val;
    struct semid_ds *buf;
    ushort *array;
    struct seminfo *__buf;
    void *__pad;
};

int main(){
    int pid, status, semid, value;
    union semun semopts;

    semid = semget(IPC_PRIVATE, 1, IPC_CREAT);

    semopts.val = 1;
    semctl(semid, 0, SETVAL, semopts);

    value = semctl(semid, 0, GETVAL, 0);
    printf("Value  = %d\n", value);

    return 0;
}

最佳答案

缺少至少授予自身对创建的信号量集的读/写访问权限的代码。

为此修改代码如下:

if (-1 == (semid = semget(IPC_PRIVATE, 1, IPC_CREAT | IPC_EXCL | S_IRUSR  | S_IWUSR)))
{
  perror("semget() failed");
  exit (EXIT_FAILURE);
}

关于c - semclt 总是返回 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18997473/

相关文章:

c - 此汇编 x86 代码的反编译 (C) 代码构造是什么?

c# - 从 Windows 可执行文件中识别编译器版本

c - 这个三元运算符的结果是什么?

python - 如何使用 python、bash 和 strace 检测 SIGHUP 发件人

linux - 使用 Linux wget 标签抓取网站

c - 信号量 : enhanced swimming pool

c++ - 与 register 关键字相关的其他语义

在 iSeries 上从 CL 调用 write() C API

ios - 在 Objective C 中使用带有信号量的委托(delegate)方法

Python 多处理信号量不工作