mmap问题

yingge2016 2017-11-05 08:25:59
	int fd = open("log.txt",O_RDWR|O_CREAT,0666);
//write(fd,&zero,sizeof(int));
int *mmp = (int*)mmap( NULL,sizeof(int),PROT_READ |
PROT_WRITE,MAP_SHARED,fd,0 );

close(fd);

*mmp=0;


这里为什么会出错呢?
...全文
148 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
FoolCarpe 2017-11-06
  • 打赏
  • 举报
回复
log.txt 文件大小比sizeof(int)小?
自信男孩 2017-11-06
  • 打赏
  • 举报
回复
映射/dev/zero会自动创建一个制定长度的映射区,但是对于普通文件是不可以。
自信男孩 2017-11-06
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>


int main(void)
{
    int zero = 100;
    int fd = open("log.txt",O_RDWR|O_CREAT,0666);
    write(fd, &zero, sizeof(int));
    int *mmp = (int *)mmap( NULL,sizeof(int),PROT_READ |
            PROT_WRITE,MAP_SHARED,fd,0 );
    if (mmp == MAP_FAILED) {
        fprintf(stderr, "map error!\n");
        goto errno_r;
    }

    close(fd);
    printf("%d\n", *mmp);
    *mmp = 0;
    printf("%d\n", *mmp);

errno_r:
    munmap(mmp, sizeof(int));

    return 0;
}
write(fd, &zero, sizeof(int));是需要的,因为若不加这句,fd的偏移不是sizeof(int)个字节; 若不加这句,可以打开/dev/zero文件,即:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>


int main(void)
{
    int zero = 100;
    //int fd = open("log.txt",O_RDWR|O_CREAT,0666);
    int fd = open("/dev/zero",O_RDWR|O_CREAT,0666);
    //write(fd, &zero, sizeof(int));
    int *mmp = (int *)mmap( NULL,sizeof(int),PROT_READ |
            PROT_WRITE,MAP_SHARED,fd,0 );
    if (mmp == MAP_FAILED) {
        fprintf(stderr, "map error!\n");
        goto errno_r;
    }

    close(fd);
    printf("%d\n", *mmp);
    *mmp = 10;
    printf("%d\n", *mmp);

errno_r:
    munmap(mmp, sizeof(int));

    return 0;
}
另外,建议加上对mmap返回值的判断

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧