C语言 mmap完成文件读写

发布时间 2023-10-18 21:54:42作者: 王景迁
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>

int main() {
    // 打开文件进行读写
    int fd = open("test.log", O_RDWR | O_CREAT, 0600);
    if (fd == -1) {
        perror("open");
        exit(1);
    }

    // 清空文件内容
    if (ftruncate(fd, 0) == -1) {
        perror("ftruncate");
        exit(1);
    }

    // lseek将文件指针往后移动1023位
    lseek(fd, 1023, SEEK_END);
    // 预先写入一个空字符,mmap不能扩展文件长度,预先给文件长度
    write(fd, " ", 1);

    // 将文件映射到内存中进行读写
    char* addr = (char*)mmap(NULL, 1024, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (addr == MAP_FAILED) {
        perror("mmap");
        exit(1);
    }

    // 关闭文件
    if (close(fd) == -1) {
        perror("close");
        exit(1);
    }

    // 数据写入直接在内存中进行,不需要使用write函数
    strcpy(addr, "123");

    // 释放内存映射
    if (munmap(addr, 1024) == -1) {
        perror("munmap");
        exit(1);
    }

    return 0;
}