日期:2014-05-16  浏览次数:21340 次

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,其行为是未定义的