linux上简单的文件映射内存,为什么地图ped等于NULL,有关问题在哪,如何找出来
linux下简单的文件映射内存,为什么mapped等于NULL,问题在哪,怎么找出来
------解决方案--------------------
EACCES:访问出错 EAGAIN:文件已被锁定,或者太多的内存已被锁定 EBADF:fd不是有效的文件描述词 EINVAL:一个或者多个参数无效 ENFILE:已达到系统对打开文件的限制 ENODEV:指定文件所在的文件系统不支持内存映射 ENOMEM:内存不足,或者进程已超出最大内存映射数量 EPERM:权能不足,操作不允许 ETXTBSY:已写的方式打开文件,同时指定MAP_DENYWRITE标志 SIGSEGV:试着向只读区写入 SIGBUS:试着访问不属于进程的内存区
应该是一个enum 0的话很有可能就是第一个访问出粗出错
------解决方案--------------------
成功执行时,mmap()返回被映射区的指针,munmap()返回0。失败时,mmap()返回MAP_FAILED[其值为(void *)-1],munmap返回-1。errno被设为以下的某个值.
代码尽量写的标准些. 错误码要在调用api后第一时间取得.
------解决方案--------------------
判断返回值==MAP_FAILED才为错误。
mmap映射的地址是是虚拟地址空间顶部的,NULL是合理的。
------解决方案--------------------
#include <stdio.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
int main()
{
int outfile;
char *mapped;
int ret;
outfile = open("test.dat", O_RDWR|O_CREAT|O_TRUNC,0640);
if (outfile < 0) {
fprintf(stderr, " open file test.dat error %m.\n");
return -1;
}
lseek(outfile, 1000, SEEK_SET);
ret = write(outfile,"\0", 1);
if (ret < 0) {
fprintf(stderr, "write error %m.\n");
close(outfile);
return -1;
}
mapped = mmap(NULL, 1000, PROT_READ|PROT_WRITE,MAP_SHARED, outfile, 0);
if (mapped == NULL) {
fprintf(stderr, "mmap error %m.\n");
close(outfile);
return -1;
}
fprintf(stdout, "%m.\n");
munmap(mapped, 1000);
close(outfile);
return 0;
}
我这里没有问题
- C/C++ code
#include <stdio.h> #include <sys/stat.h> #include <sys/mman.h> #include <sys/types.h> #include <string.h> #include <stdlib.h> #include <errno.h> #include <unistd.h> #include <fcntl.h> int main() { int outfile; char *mapped; if((outfile=open("test.dat",O_RDWR|O_CREAT|O_TRUNC,0640))==-1) { printf("CAN'T OPEN THIS FILE!\n"); exit(254); } lseek(outfile,1000,SEEK_SET); if(write(outfile,"\0",1)==-1) { printf("error ,werite fiail \n"); exit(254); } mapped= mmap(NULL,1000,PROT_READ|PROT_WRITE,MAP_SHARED,outfile,0); if(mapped== NULL); { printf("ERROR IN MMAP FAILED !\n"); exit(254); } return 0; }
------解决方案--------------------
EACCES:访问出错 EAGAIN:文件已被锁定,或者太多的内存已被锁定 EBADF:fd不是有效的文件描述词 EINVAL:一个或者多个参数无效 ENFILE:已达到系统对打开文件的限制 ENODEV:指定文件所在的文件系统不支持内存映射 ENOMEM:内存不足,或者进程已超出最大内存映射数量 EPERM:权能不足,操作不允许 ETXTBSY:已写的方式打开文件,同时指定MAP_DENYWRITE标志 SIGSEGV:试着向只读区写入 SIGBUS:试着访问不属于进程的内存区
应该是一个enum 0的话很有可能就是第一个访问出粗出错
------解决方案--------------------
成功执行时,mmap()返回被映射区的指针,munmap()返回0。失败时,mmap()返回MAP_FAILED[其值为(void *)-1],munmap返回-1。errno被设为以下的某个值.
代码尽量写的标准些. 错误码要在调用api后第一时间取得.
------解决方案--------------------
判断返回值==MAP_FAILED才为错误。
mmap映射的地址是是虚拟地址空间顶部的,NULL是合理的。
------解决方案--------------------
#include <stdio.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
int main()
{
int outfile;
char *mapped;
int ret;
outfile = open("test.dat", O_RDWR|O_CREAT|O_TRUNC,0640);
if (outfile < 0) {
fprintf(stderr, " open file test.dat error %m.\n");
return -1;
}
lseek(outfile, 1000, SEEK_SET);
ret = write(outfile,"\0", 1);
if (ret < 0) {
fprintf(stderr, "write error %m.\n");
close(outfile);
return -1;
}
mapped = mmap(NULL, 1000, PROT_READ|PROT_WRITE,MAP_SHARED, outfile, 0);
if (mapped == NULL) {
fprintf(stderr, "mmap error %m.\n");
close(outfile);
return -1;
}
fprintf(stdout, "%m.\n");
munmap(mapped, 1000);
close(outfile);
return 0;
}
我这里没有问题