免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9246 | 回复: 9

帮忙给看一下!storage size of `sem_union' isn't known [复制链接]

论坛徽章:
0
发表于 2006-12-27 18:26 |显示全部楼层
(原标题:帮忙给看一下!我的程序怎么回事了!)

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 编辑 ]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2006-12-27 19:25 |显示全部楼层
在semun.h中
加入一行:
#include <sys/sem.h>
试试。

论坛徽章:
0
发表于 2006-12-27 19:33 |显示全部楼层
#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 这个条件编译在编译时定义了吗??或者在你的头文件里面有定义吗,检查一下

论坛徽章:
0
发表于 2006-12-27 19:33 |显示全部楼层
#ifdef _SEMUN_H

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

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2006-12-27 19:35 |显示全部楼层
原帖由 wyaccent 于 2006-12-27 19:33 发表
#ifdef _SEMUN_H

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

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

论坛徽章:
0
发表于 2006-12-27 20:29 |显示全部楼层
确实是wyaccent所说的那样,编译通过了;但小弟不明白为什么要改那里,能帮忙给些解释吗?

论坛徽章:
0
发表于 2006-12-27 20:35 |显示全部楼层
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

论坛徽章:
0
发表于 2006-12-27 20:39 |显示全部楼层
对啦,就是这里。看代码的时候,无论是条件编译指令,还是实际代码,都自己在脑子里过一遍,看看逻辑上有没有问题。这样能消除不少错误。

/* 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 编辑 ]

论坛徽章:
0
发表于 2006-12-27 20:45 |显示全部楼层
另外,我保留了本帖,修改了标题,方便大家查找。如有冒犯之处,还请原谅

论坛徽章:
0
发表于 2006-12-27 20:46 |显示全部楼层
谢谢助为了,小弟明白了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP