mikan's technical note

仕事&趣味で実験した小技の備忘録です(Linux,windows,DOS等)

MENU

【C言語 メモリマップドファイル】

//
// 【メモリマップドファイル】※solaris10で動作確認済み 
// (c) 2017 mikan
// ※使用にあたっては利用者の自己責任でお願いします。
//
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/stat.h>

int main(int argc, char *argv[])
{
    int    fd;        // ファイルディスクリプタ
    char   *p;        // マッピングアドレス
    struct stat sbuf; // ファイル情報

    // ----- ファイルオープン
    printf("file=%s\n", argv[1]);
    fd = open(argv[1], O_RDONLY);
    if(fd == -1) {
        perror("open error");
        return -1;
    }

    // ----- ファイル情報取得
    if(stat(argv[1], &sbuf) == -1) {
        perror("stat error");
        return -1;
    }

    printf("size=%ld\n", sbuf.st_size);
    
    // ----- メモリ割り当て
    p = (char *)mmap((caddr_t)0, sbuf.st_size, PROT_READ, MAP_SHARED, fd, 0);
    if(p == (char *)-1) {
        perror("mmap error");
        return -1;
    } else {
        printf("mmap success!\n");
    }

    // ----- 改行コードの数をカウント
    unsigned long i, cnt;
    i = 0;
    cnt = 0;
    while(1) {
        if(p[i] == 0x0a) {
            cnt ++;
        }
        i ++;
        if(i >= sbuf.st_size) {
            break;
        }
    }

    printf("cnt=%ld, i=%ld\n", cnt, i);

    // ----- メモリ開放
    if(munmap(p, sbuf.st_size) == -1) {
        perror("munmap error");
        return -1;
    }

    close(fd);

    return 0;
}