Skip to main content

ログ取得ツール (移転先予定地)

Read Onlyでcreat(2)したファイルディスクリプタにwrite(2)が成功するなんて…

愚かな私は知りませんでした。

#include #include #include #include #include

char data[] = “test\n”;

int main(int argc, char **argv) { int f, r; if(argc!=2){ printf(“Usage: %s filename\n”, argv[0]); exit(1); } f=creat(argv[1], 0444); // open(argv[1], O_WRONLY|O_CREAT|O_TRUNC, 0444); if(f==-1){ perror(“creat”); exit(1); } r=write(f, data, sizeof(data)); printf(“write return: %d\n”, r); return 0; }

で、


# gcc -o testcreat testcreat.c
# ./testcreat testfile
write return: 6
# ls -l testfile
r--r--r--    1 wtnb     users           6 Jun 16 08:57 testfile
# ./testcreat testfile
creat: Permission denied

なのです。GNU tarはこれを利用しているようです(パーミッション情報を指定してcreatしてからwriteするので、後でchmod(2)を呼ばなくてもRead Onlyのファイルを作って書ける)。

コメントのopen(2)を見ると、何が起きてるかわかりやすいかなぁと思う。