【问题标题】:Linux System V IPC: Unable to initialize semaphore valueLinux System V IPC:无法初始化信号量值
【发布时间】:2016-10-01 08:41:50
【问题描述】:

我为演示目的创建了一个简单的信号量初始化示例:

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

int init_semaphore(int semid, int semnum, int initval)
{
    union semun pack;
    pack.val = initval;
    return semctl(semid,semnum,SETVAL,pack);
}

但我得到了错误:

error: aggregate ‘init_semaphore(int, int, int)::semun pack’ has incomplete type and cannot be defined

我无法理解为什么编译器会抛出错误。标题也正确包含。

【问题讨论】:

  • man semctl: [...]当有四个时,第四个的类型为 union semun。调用程序必须如下定义这个联合: union semun { int val; / SETVAL 的值 / struct semid_ds *buf; / IPC_STAT 的缓冲区,IPC_SET / unsigned short *array; / GETALL、SETALL 的数组/ struct seminfo *__buf; / IPC_INFO 缓冲区(Linux 特定)/ };
  • @EOF - 这是一个答案,而不是评论(现在 AndrewHenle 将其作为答案)

标签: c linux ipc semaphore sysv-ipc


【解决方案1】:

你必须自己明确声明union semun

根据POSIX standard for semctl()

semctl()函数提供了多种信号量控制 cmd 指定的操作。第四个参数是可选的,并且 取决于请求的操作。如果需要,它是类型 union semun应用程序应明确声明

union semun {
    int val;
    struct semid_ds *buf;
    unsigned short  *array;
} arg;

根据Linux man page

这个函数有三个或四个参数,取决于cmd。什么时候 有四个,第四个的类型为union semun。呼唤 程序必须如下定义这个联合:

   union semun {
       int              val;    /* Value for SETVAL */
       struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
       unsigned short  *array;  /* Array for GETALL, SETALL */
       struct seminfo  *__buf;  /* Buffer for IPC_INFO
                                   (Linux-specific) */
   };

【讨论】:

  • 你知道让程序声明union semun,而不是简单地在像&lt;sys/sem.h&gt;这样的标准头文件中声明的基本原理吗?
  • @NateEldredge 我能想到的唯一原因是,当调用标准化时,会破坏太多遗留代码。
猜你喜欢
  • 2016-05-09
  • 2011-06-02
  • 2015-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 2010-10-22
  • 1970-01-01
相关资源
最近更新 更多