首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

union semun 变量编译时说大小无法确定,为什么?该如何解决

2012-03-12 
union semun 变量编译时说大小无法确定,为什么?我在编译如下代码时,编译器报了一堆错误,其中有一个是“a40.

union semun 变量编译时说大小无法确定,为什么?
我在编译如下代码时,编译器报了一堆错误,其中有一个是“a40.c:28:   错误:‘semopts’   的存储大小未知”,为什么啊:
#include   <sys/types.h>
#include   <sys/ipc.h>
#include   <sys/sem.h>
#include   <sys/shm.h>
#include   <stdio.h>
#include   <stdlib.h>
#include   <string.h>
#include   <signal.h>
#define   SEM_NUM   10
#define   SEM_MODE   (IPC_CREAT|0660)

void   changemode(int   sid,   char   *mode);
void   printfmode   (union   semun   *arg);


void   printfmode   (union   semun   *arg)
{
                printf( "mode=%d:\n ",   arg-> buf-> sem_perm.mode);
                return;
}


int   main(void)
{
                int   semid;
                union   semun   semopts;
                struct   semid_ds   semds;

                if   ((semid=semget(IPC_PRIVATE,   SEM_NUM,   SEM_MODE))==-1)
                {
                                fprintf(stderr,   "semget   error!\n ");
                                exit(1);
                }

                semopts.buf=&semds;
                if((semctl(semid,0,IPC_STAT,semopts))==-1)
                {
                                fprintf(stderr,   "get   semid_ds   error!\n ");
                                exit(1);
                }

                printfmode(&semopts);
                changemode(semid,   "0600 ");


                if((semctl(semid,0,   IPC_STAT,   semopts))==-1)
                {
                                fprintf(stderr,   "get   semid_ds   error!\n ");
                                exit(1);
                }
                printfmode(&semopts);

                if((semctl(semid,0,   IPC_RMID,   0)) <0)
                {
                                fprintf(stderr, "semctl   error\n ");


                                exit(1);
                }
                exit(0);
}


void   changemode(int   sid,   char   *mode)
{
                int   rc;
                union   semun   semopts;
                struct   semid_ds   mysemds;

                semopts.buf=&mysemds;
                rc=semctl(sid,0,   IPC_STAT,   semopts);

                if(rc==-1)
                {
                                printf( "semctl   error!\n ");
                                exit(1);
                }

                sscanf(mode, "%ho ",   &semopts.buf-> sem_perm.mode);
                semctl(sid,0,   IPC_SET,   semopts);

                return;
}

如果我把头文件改为
#include   <sys/types.h>
//#include   <sys/ipc.h>
//#include   <sys/sem.h>
#include   <linux/sem.h>
#include   <stdio.h>
编译可以通过,但是在运行printf( "mode=%d:\n ",   arg-> buf-> sem_perm.mode);
时报错,说段错误,哪位高手能指点一下阿?


[解决办法]
union semun semopts;
是这行的问题, 你这个union的大小系统未知.
我对这个结构不了解, 是不是需要init啊

热点排行