linux上简单的文件映射内存,为什么地图ped等于NULL,有关问题在哪,如何找出来

linux下简单的文件映射内存,为什么mapped等于NULL,问题在哪,怎么找出来
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;
}

我这里没有问题