当前位置: 技术问答>linux和unix
程序传参问题,大家指教,初学。谢谢了。
来源: 互联网 发布时间:2016-04-26
本文导语: 小弟写的一段程序,要实现把一个给定的结构体用共享内存方式实现接口,函数接口共享内存的名字,及要设置共享内存的结构体,返回指向共享内存的指针。 就是给定共享内存的名字和结构体,返回指向共享内存...
小弟写的一段程序,要实现把一个给定的结构体用共享内存方式实现接口,函数接口共享内存的名字,及要设置共享内存的结构体,返回指向共享内存的指针。
就是给定共享内存的名字和结构体,返回指向共享内存的指针。
但是发现一个问题就是我下面的实现在mmap前的强制类型转换时是不行的,请问这个要怎么实现?
void creatsmm(char * sname, void **p)
{
int fd;
int i;
fd = open(sname,O_RDWR|O_CREAT,00777);
lseek(fd,sizeof(*p),SEEK_SET);
write(fd,"",1);
*p = ((*p)*)mmap(NULL,sizeof(*p),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
close(fd);
return *p;
}
就是给定共享内存的名字和结构体,返回指向共享内存的指针。
但是发现一个问题就是我下面的实现在mmap前的强制类型转换时是不行的,请问这个要怎么实现?
void creatsmm(char * sname, void **p)
{
int fd;
int i;
fd = open(sname,O_RDWR|O_CREAT,00777);
lseek(fd,sizeof(*p),SEEK_SET);
write(fd,"",1);
*p = ((*p)*)mmap(NULL,sizeof(*p),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
close(fd);
return *p;
}
|
#include
#include
#include
#include
#include
#include
void* CreateShm(const char* name,int size)
{
int fd,i;
fd = open(name,O_RDWR|O_CREAT,00777);
if(fda=5;pc->b=8;
c = *pc;
int *ipc = (int*)pc;
*(ipc+4)=99;
printf("%dt%dt%dn",c.a,c.b,*(ipc+4));
munmap(pc, sizeof(c));
return 0;
}
可以看出,用内存映射出来的内存,一般是1024/4049之类的边界对其的,可以用ipc+1023来确认
创建函数还可以加上内存映射标志。
|
void* creatsmm(char * sname, int size)
参数:sname为名称,size为结构体大小,返回p指向起始地址。
参数:sname为名称,size为结构体大小,返回p指向起始地址。
|
跟4楼的函数原型差不多的实现, 通常都是这么实现的。
按照一楼地方法是不行地,sizeof(*p)是指针的大小。
其实这个跟 向函数的形参传一个一维数组一样的道理,形参获得的只是个指针,他不知道指向的具体类型地。
按照一楼地方法是不行地,sizeof(*p)是指针的大小。
其实这个跟 向函数的形参传一个一维数组一样的道理,形参获得的只是个指针,他不知道指向的具体类型地。
|
mmap()内指定结构也没有什么意义,它还是先用sizeof()计算大小,然后按照大小分配
所以直接指定要分配的共享内存大小,后面转换
所以直接指定要分配的共享内存大小,后面转换