当前位置: 技术问答>linux和unix
64位Linux shmat返回值被截断
来源: 互联网 发布时间:2017-03-02
本文导语: 共享内存的基本用法: shmget shmat 调用都没有问题 对shmat做了封装,示意代码如下 char* LinkShm(int shm_id, int flag) { char *shmptr; shmptr = shmat(shm_id,NULL,flag); return shm_ptr; } 然后调用返回的值,一直是错误的...
共享内存的基本用法:
shmget
shmat
调用都没有问题
对shmat做了封装,示意代码如下
然后调用返回的值,一直是错误的,调用代码如下:
使用gdb调试发现,函数LinkShm()中的shmptr的值是对的,返回给调用者指针shmptr时shmat返回的64位地址,高位4字节给截断了,并且补上了0xffffffff,后面4个字节是正确地址的低位4字节。
直接调用shmat,即:
依然是同样的错误。
想不通是什么原因。指针转换我也试过,一样的错误。
补充:
编译的时候出现警告:将整数值赋值给指针未做正确转换。(大致是这样,凭记忆)
shmget
shmat
调用都没有问题
对shmat做了封装,示意代码如下
char* LinkShm(int shm_id, int flag)
{
char *shmptr;
shmptr = shmat(shm_id,NULL,flag);
return shm_ptr;
}
然后调用返回的值,一直是错误的,调用代码如下:
char* shmptr;
shmptr = LinkShm(shm_id,0);
使用gdb调试发现,函数LinkShm()中的shmptr的值是对的,返回给调用者指针shmptr时shmat返回的64位地址,高位4字节给截断了,并且补上了0xffffffff,后面4个字节是正确地址的低位4字节。
直接调用shmat,即:
char* shmptr;
shmptr = shmat(shm_id,NULL,0);
依然是同样的错误。
想不通是什么原因。指针转换我也试过,一样的错误。
补充:
编译的时候出现警告:将整数值赋值给指针未做正确转换。(大致是这样,凭记忆)
|
在调用前加上声明
char* LinkShm(int shm_id, int flag);
char* shmptr;
shmptr = shmat(shm_id,NULL,0);