Linux System V IPC:无法初始化信号量值

时间:2016-06-01 20:06:27

标签: c linux ipc semaphore sysv-ipc

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

#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

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

1 个答案:

答案 0 :(得分:4)

您必须自己明确声明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类型。呼唤           program 必须按如下方式定义此联合:

   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) */
   };