读书人

union semun 变量编译时说大小无法确定

发布时间: 2012-03-12 12:45:32 作者: rapoo

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啊

读书人网 >UNIXLINUX

热点推荐