LoginSignup
1
0

More than 5 years have passed since last update.

mmap時の権限エラー

Posted at

事象

ファイルをopenして、mmapで読み込もうとしてもエラーになってしまった。errnoで確認すると、コード13エラーであった。

コード

test.c
#include <unistd.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>

int main(void)
{
        int number;
        int fd = open("test.txt", O_WRONLY);
        struct stat stbuf;
        char *addr;
        if(fstat(fd, &stbuf) == -1){
                printf("error\n");
        }
//        printf("stbuf.st_size: %ld\n", stbuf.st_size);
        addr = mmap(NULL, stbuf.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
        number = errno;
        if(addr == MAP_FAILED){
                printf("print error code: %d\n", number);
        }

        close(fd);
        return 0;
}

実行結果

print error code: 13

13は参考(5)によると権限エラー

原因

open するときの権限が間違っていた。
(1)にある通り、以下。コード中では書き込み権限で open していたが、mmapでは読み取りで開いていた。

引き数 prot には、マッピングのメモリー保護をどのように行なうかを指定する (ファイルのオープンモードと矛盾してはいけない)

対処

open 関数の第二引数を O_RDWR にした

参考

(1)Man page of MMAP https://linuxjm.osdn.jp/html/LDP_man-pages/man2/mmap.2.html

(2)O_WRONLY https://linuxjm.osdn.jp/html/LDP_man-pages/man2/open.2.html

(3)IBM Knowledge Center - mmap() - メモリーのページのマップ https://www.ibm.com/support/knowledgecenter/ja/SSLTBW_2.2.0/com.ibm.zos.v2r2.bpxbd00/mmap.htm

(4)errnoでエラーを確認する - Qiita http://qiita.com/ota42y/items/b2f59d7a82c550648677

(5)errnoの値の定義を探す - Qiita http://qiita.com/h2suzuki/items/0cc924cdd9d5c6d47448

(6)Gaucheからmmapを使ってみる1 - びぼうろく http://d.hatena.ne.jp/herrmrnmrm/20120922/1348338227

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0