3

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

#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

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

4

1 回答 1

4

您必须明确声明union semun自己。

根据POSIX 标准semctl()

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

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

根据Linux 手册页

此函数具有三个或四个参数,具体取决于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) */
   };
于 2016-06-01T20:14:31.367 回答