首页 > 学技术 > 技术网文 > C/C++ > 正文

[保留] 帮忙给看一下!storage size of `sem_union' isn't known


来源 chinaunix.net kuqin整理

(原标题:帮忙给看一下!我的程序怎么回事了!)

gcc -o sem1 sem1.c
sem1.c: In function `set_semvalue':
sem1.c:67: storage size of `sem_union' isn't known
sem1.c: In function `del_semvalue':
sem1.c:77: storage size of `sem_union' isn't known


/* semun.h */
#ifdef _SEMUN_H

#define _SEMUN_H

union semun {
int val; /* value for SETVAL */
struct semid_ds *buf; /* buffer for IPC_STAT, IPC_SET */
unsigned short int *array;  /* array for GETALL, SETALL */
struct seminfo *__buf; /* buffer for IPC_INFO */
};

#endif


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

#include "semun.h"

static int set_semvalue(void);
static void del_semvalue(void);
static int semaphore_p(void);
static int semaphore_v(void);

static int sem_id;

int main(int argc, char *argv[])
{
int i;
int pause_time;
char op_char = 'O';

srand((unsigned int)getpid());

sem_id = semget((key_t)1234, 1, 0666 | IPC_CREAT);

if(argc > 1)
{
if(!set_semvalue())
{
fprintf(stderr, "Failed ot initialize semaphore\n");
exit(EXIT_FAILURE);
}
op_char = 'X';
sleep(2);
}

for(i = 0; i < 10; i++)
{
if(!semaphore_p())
exit(EXIT_FAILURE);
printf("%C", op_char);
fflush(stdout);
pause_time = rand() % 3;
sleep(pause_time);
printf("%C", op_char);
fflush(stdout);

if(!semaphore_v())
exit(EXIT_FAILURE);
pause_time = rand() % 2;
sleep(pause_time);
}

printf("\n%d - finished\n", getpid());

if(argc > 1)
{
sleep(10);
del_semvalue();
}
exit(EXIT_SUCCESS);
}

static int set_semvalue(void)
{
union semun sem_union;

sem_union.val = 1;
if(semctl(sem_id, 0, SETVAL, sem_union) == -1)
return (0);
return (1);
}

static void del_semvalue(void)
{
union semun sem_union;

if(semctl(sem_id, 0, IPC_RMID, sem_union) == -1)
fprintf(stderr, "Failed to delete semaphore\n");
}

static int semaphore_p(void)
{
struct sembuf sem_b;

sem_b.sem_num = 0;
sem_b.sem_op = -1;
sem_b.sem_flg = SEM_UNDO;
if(semop(sem_id, &sem_b, 1) == -1)
{
fprintf(stderr, "semaphore_p failed\n");
return (0);
}
return (1);
}

static int semaphore_v(void)
{
struct sembuf sem_b;

sem_b.sem_num = 0;
sem_b.sem_op = 1; /* V() */
sem_b.sem_flg = SEM_UNDO;
if(semop(sem_id, &sem_b, 1) == -1)
{
fprintf(stderr, "semaphore_v failed\n");
return (0);
}
return (1);
}

[ 本帖最后由 langue 于 2006-12-27 20:45 编辑 ]



 lenovo 回复于:2006-12-27 19:25:35

在semun.h中
加入一行:
#include <sys/sem.h>
试试。


 wyaccent 回复于:2006-12-27 19:33:08

#ifdef _SEMUN_H

#define _SEMUN_H

union semun {
        int val;                        /* value for SETVAL */
        struct semid_ds *buf;                /* buffer for IPC_STAT, IPC_SET */
        unsigned short int *array;         /* array for GETALL, SETALL */
        struct seminfo *__buf;                /* buffer for IPC_INFO */
};

#endif

#ifdef _SEMUN_H 这个条件编译在编译时定义了吗??或者在你的头文件里面有定义吗,检查一下


 wyaccent 回复于:2006-12-27 19:33:48

#ifdef _SEMUN_H

是不是应该改为#ifndef跟合理??


 lenovo 回复于:2006-12-27 19:35:12

引用:原帖由 wyaccent 于 2006-12-27 19:33 发表
#ifdef _SEMUN_H

是不是应该改为#ifndef跟合理?? 


汗,就应该是你说的,
我没仔细看。


 yyying 回复于:2006-12-27 20:29:44

确实是wyaccent所说的那样,编译通过了;但小弟不明白为什么要改那里,能帮忙给些解释吗?


 yyying 回复于:2006-12-27 20:35:39

man semctl 是这样说的

This  function  has  three  or four arguments. When there are four, the
       call is semctl(semid,semnum,cmd,arg); where the fourth argument arg has
       a type union semun defined as follows:

       #if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED)
       /* union semun is defined by including <sys/sem.h> */
       #else
       /* according to X/OPEN we have to define it ourselves */
       union semun {
             int val;                  /* value for SETVAL */
             struct semid_ds *buf;     /* buffer for IPC_STAT, IPC_SET */
             unsigned short *array;    /* array for GETALL, SETALL */
                                       /* Linux specific part: */
             struct seminfo *__buf;    /* buffer for IPC_INFO */
       };
       #endif


 langue 回复于:2006-12-27 20:39:41

对啦,就是这里。看代码的时候,无论是条件编译指令,还是实际代码,都自己在脑子里过一遍,看看逻辑上有没有问题。这样能消除不少错误。

/* semun.h */
#ifdef _SEMUN_H

#define _SEMUN_H

union semun {
        int val;                        /* value for SETVAL */
        struct semid_ds *buf;                /* buffer for IPC_STAT, IPC_SET */
        unsigned short int *array;         /* array for GETALL, SETALL */
        struct seminfo *__buf;                /* buffer for IPC_INFO */
};

#endif

把 #ifdef 改成 #ifndef

想想,自己写这些 #if(n)def ... #define ... #endif,到底为了什么。这样就不难明白为什么要换为 #ifndef 啦。

:)

[ 本帖最后由 langue 于 2006-12-27 20:47 编辑 ]


 langue 回复于:2006-12-27 20:45:49

另外,我保留了本帖,修改了标题,方便大家查找。如有冒犯之处,还请原谅 :)


 yyying 回复于:2006-12-27 20:46:06

谢谢助为了,小弟明白了!




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=877235
转载请注明作者名及原文出处



收藏本页到: