2017-02-12 1 views
0

バイトファイルを変更する単純なmmapプログラムを作成しました。シンプル/小さなファイルにrootとして ランは、コードがmmapを使用してファイルを変更するときの許可エラー

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <sys/mman.h> 

int main(int argc, char *argv[]) { 
    int fd = open(argv[1], O_WRONLY); 
    printf("fd=%d\n", fd); 
    char *p = mmap(0, 0x1000, PROT_WRITE, MAP_SHARED, fd, 0); 
    if (p == MAP_FAILED) { 
     perror ("mmap"); 
     return 1; 
    } 
    p[0] = 0xde; 
    close(fd); 
    return 0; 
} 

スニペットエラー

# ./a.out tmp.txt 92 
fd=3 
mmap: Permission denied 

を得た間違っていたのだろうか。ありがとう。

UPDATE1 は、コードスニペットのタイプミスを修正、私はそこPROT_WRITEを使用することを意味しました。 MMAPのmanページから

+0

「PROT_WRITE」を使用してコードスニペットを修正しましたが、同じ話がありました。 – packetie

+0

ファイルのサイズは本当に '0x1000'バイトですか?これは4096バイトです。 – mch

+0

サイズは実際には92バイトで、私のLinux上ではページサイズなので '0x1000'です – packetie

答えて

3

EACCESファイルディスクリプタは、非正規のファイルを参照します。または、ファイルマッピングが要求されましたが、fdが読み込み用に開かれていません。または MAP_SHAREDは、要求されたとPROT_WRITEが設定されていますが、fdは、読み取り/書き込み(O_RDWR)モードでオープン ではありません。またはPROT_WRITEが設定されていますが、 ファイルは追加専用です。

だから、MAP_SHAREDファイルをマッピングするために、あなたがいない書き込み専用、読み取り/書き込みモードで開く必要があります。書き込まないメモリの部分を初期化するには、ファイルの内容を読み込む必要があるため、意味があります。

さらに、IA-32ではページの書き込み専用マッピングが許可されていないため、このようなマシンでPROT_WRITEを使用してマッピングすると暗黙的にPROT_READが有効になり、読み込み不可能なファイル記述子では失敗します。

関連する問題