将数组作为共享内存,mmap函数要怎么写呢?
新手求教啊我定义了一个数组inta[20],然后想用mmap函数进行映射,然后就写了这句:a=(int*)mmap(NULL,sizeof(int)*20,PROT_RE...
新手求教啊
我定义了一个数组int a[20],然后想用mmap函数进行映射,然后就写了这句:
a=(int *)mmap(NULL,sizeof(int)*20,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);
但是报错说a是int [20]类型的和int * 的类型不符合,改成int 或者改成 int[20]或者改成a[]都还是错,精疲力竭了……求问到底要怎么改啊…… 难道一定要用struct结构体才可以吗?可是我就只要用到一个数组就可以了…
再问一个,新建线程的时候想用pthread_create,但是我线程调用的函数的参数是int类型的,
void *create(void *arg)
{
int *num;
num=(int *)arg;
……}
int main(void)
{
int test=4;int *arg=&test;
……
ret=pthread_create(&tidp,NULL,create,(void *)arg);
……}
这种方法已经试过了。
invalid operands to binary * (have ‘unsigned int’ and ‘void *’)报错了……
我就想问我要怎么样才能将int类型的传递进去呢,我的函数里确实就是要传入一个整形变量的。 展开
我定义了一个数组int a[20],然后想用mmap函数进行映射,然后就写了这句:
a=(int *)mmap(NULL,sizeof(int)*20,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);
但是报错说a是int [20]类型的和int * 的类型不符合,改成int 或者改成 int[20]或者改成a[]都还是错,精疲力竭了……求问到底要怎么改啊…… 难道一定要用struct结构体才可以吗?可是我就只要用到一个数组就可以了…
再问一个,新建线程的时候想用pthread_create,但是我线程调用的函数的参数是int类型的,
void *create(void *arg)
{
int *num;
num=(int *)arg;
……}
int main(void)
{
int test=4;int *arg=&test;
……
ret=pthread_create(&tidp,NULL,create,(void *)arg);
……}
这种方法已经试过了。
invalid operands to binary * (have ‘unsigned int’ and ‘void *’)报错了……
我就想问我要怎么样才能将int类型的传递进去呢,我的函数里确实就是要传入一个整形变量的。 展开
2个回答
展开全部
mmap函数的使用方法 UNIX网络编程第二卷进程间通信对mmap函数进行了说明。该函数主要用途有三个:1、仔前将一个普通文件映射到内存中bf通常在需要对文件进行频繁读写时使用v这样用内存读写取代I/O读写,以获得较高的性能;2、将特殊文件进行匿名内存映射,可以为关联进程提供共享内存空间;3、为无关联的进程提供共享内存空间,一般也是将一个普通文件映射到内存中。函数:void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offsize); 参数start:指向欲映射的内存起始地址,通常设为 NULL,代表让系统自动选定地址,映射成功后返回该地址。参数length:代表将文件中多大的部分映射到内存。参数prot:映射区域的保护方式。可以为以下几粗谨种方式的组合:PROT_EXEC 映射区域可被执行PROT_READ 映射区域可被读取PROT_WRITE 映射区域可被写入PROT_NONE 映射区域不能存取参数flags:影响映射区域的各种特性。在调用mmap()时必须要指定MAP_SHARED 或MAP_PRIVATE。MAP_FIXED 如果参数start所指的地址无法成功建立映射时,则放弃映射,不对地址做修正s通常不鼓励用此旗标。MAP_SHARED对映射区域的写入数据会复制回文件内,而且允许其他映射该文件的进程共享。MAP_PRIVATE 对映射区域的写入操作会产生一个映射文件的复制,即私人的“写入时复制”(copy on write)对此区域作的任何修改都不会写回原来的文件内容。MAP_ANONYMOUS建立匿名映射。此时会忽略参数fddhl不涉及文件,而且映射区域无法和其他进程共享。MAP_DENYWRITE只允许对映射区域的写入操作,其他对文件直接写入的操作将会被拒绝。MAP_LOCKED 将映射区域锁定住,这表示该区域不会被置换(swap)。参数fd:要映射到内存中的文件描述符。如果使用匿名内存映射时,即flags中设置了MAP_ANONYMOUS,fd设为-1。有些系统不支持匿名内存映射,则可以使用fopen打开/dev/zero文件,然后对该文件进行映射,可以同样达到匿名内存映射的效果。参数offset:文件映射的偏移量,通常设置为0,代表从文件最前方开始对应,offset必须是分页大小的整数倍。返回值:若映射成功则返回映射区的内存起始地址,否则返回MAP_FAILED(-1),错误原因存于errno 中。错误代码:EBADF 参数fd 不是有效的文件描述词EACCES 存取权限有误。如果是念凳清MAP_PRIVATE 情况下文件必须可读,使用MAP_SHARED则要有PROT_WRITE以及该文件要能写入。EINVAL 参数start、length 或offset有一个不合法。EAGAIN 文件被锁譼蚴怯刑嗄诖姹凰 #牛危希停牛汀∧诖娌蛔恪O低车饔茫恚恚幔穑ǎ┯糜诠蚕砟诖娴牧街址绞剑骸。ǎ保┦褂闷胀ㄎ募峁┑哪诖嬗成洌菏视糜谌魏谓讨洹4耸保枰蚩虼唇ㄒ桓鑫募缓笤俚饔茫恚恚幔穑ǎ┑湫偷饔么肴缦拢海妫洌剑铮穑澹睿ǎ睿幔恚澹。妫欤幔纾。恚铮洌澹弧。椋妫ǎ妫洌Γ欤簦唬埃。穑簦颍剑恚恚幔穑ǎ危眨蹋蹋。欤澹睢。。校遥希裕撸遥牛粒模校遥希裕撸祝遥桑裕牛。停粒校撸樱龋粒遥牛摹。。妫洹。。埃弧⊥ü恚恚幔穑ǎ┦担嘞氯模荆
追问
非常感谢你回答我,但是你这个复制也复制的太乱了吧,而且关于mapp函数介绍什么的我都看过了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询