红联Linux门户
Linux帮助

关于Linux下信号量处理失效问题的研究

发布时间:2007-05-30 00:40:22来源:红联作者:Quickgram
OS: SUSE Linux Enterprise9.0

问题描述:创建的信号量,调用sem_wait后返回错误,错误码22(EINVAL),表示和sem地址空间无效

分析:信号量的建立和使用和信号量的首地址有关,不能在奇地址上,测试中对比结构如下,

其中数据结构的定义,采用字节对齐方式(只有这样,才会有奇地址的问题)

#ifdef _WIN32
#pragma pack(push,1)
#else
#pragma pack(1)
#endif

//定义代码(略)

#ifdef _WIN32
#pragma pack(pop)
#else
#pragma pack()
#endif

=========!!!对比如下!!!================

正确处理的数据结构:

typedef struct ssss
{
sem_t sem;
unsigned char iii;
}SSSS;

错误处理的数据结构:

typedef struct ssss
{
unsigned char iii;
sem_t sem;
}SSSS;

主程序为:

int main(void){
int iii;
pthread_t t1,t2,t3,t4;

ss = (SSSS *)malloc(sizeof(SSSS));
ss->iii = 0xFF;
sem_init(&ss->sem,0,1);
sem_getvalue(&ss->sem,&val);
printf("val1=%d\n",val);
sleep(2);
sem_getvalue(&ss->sem,&val);
printf("val2=%d\n",val);
iii=sem_wait(&ss->sem);
printf("main &ss->sem=%d OK\n", &ss->sem);
sem_getvalue(&ss->sem,&val);
printf("val3=%d\n",val);
iii=sem_wait(&ss->sem);
printf("main &ss->sem=%d OK\n", &ss->sem);
sem_post(&ss->sem);
getchar();
}

由于信号量涉及Linux核心代码,考虑可能是为了提高访问效率有这样的限制,但对于这样的问题,目前还没有查寻到官方的解释,有空的时候,准备看一下实现源码,应该就能知道问题的确切原因,先记录下来,以备XDJM先解决问题。
文章评论

共有 0 条评论