mmap问题

yingge2017 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;


这里为什么会出错呢?
...全文
102 3 点赞 打赏 收藏 举报
写回复
3 条回复
切换为时间正序
当前发帖距今超过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返回值的判断
  • 打赏
  • 举报
回复
相关推荐
发帖
C语言
加入

6.5w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2017-11-05 08:25
社区公告
暂无公告