mmap内存映射函数报错,no such device
char *start;
char *end;
sockfd=socket(AF_INET,SOCK_STREAM,0);
address.sin_family=AF_INET;
address.sin_addr.s_addr=inet_addr("127.0.0.1");
address.sin_port=htons(7999);
len=sizeof(address);
result=connect(sockfd,(struct sockaddr *)&address,len);
if((fd = open("1.zip",O_WRONLY|O_CREAT)) == -1) {
printf("Open 1.zip error:%s\n",strerror(errno));
exit(EXIT_FAILURE);
}
if(-1==(truncate("1.zip",size))) {
printf("truncate error\n");
exit(EXIT_FAILURE);
}
number=size/4096;
for(i=1;i<=((number/2)+1);i++){
start=mmap(NULL,4096,PROT_READ,MAP_PRIVATE,sockfd,0);
if( start == MAP_FAILED ){
printf("map start error %s",strerror(errno));
exit(EXIT_FAILURE);
}
end=mmap(0,4096,PROT_WRITE,MAP_SHARED,fd,0);
if( end == MAP_FAILED ){
printf("map end error");
exit(EXIT_FAILURE);
}
bzero(start,4096);
bzero(end,4096);
memcpy(end,start,4096);
munmap(start,4096);
munmap(end,4096);
用strace 跟踪到第一个start=mmp(...)的时候程序就停下来了,提示错误是找不到设备文件。
服务器我用的sendfile传到socket缓冲区,这个代码没贴出来,应该没问题。
求大牛。。。。昨晚搞到现在还是不知道原因所在。
------解决方案--------------------
应该是不行
apue中说,Memory-mapped I/O lets us map a file on disk into a buffer in memory.
另外,socket描述符一节有一个列表,关于不同的函数针对socket描述符的行为。
对于mmap,其行为是未定义的