事象
ファイルをopenして、mmapで読み込もうとしてもエラーになってしまった。errnoで確認すると、コード13エラーであった。
コード
# 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