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)を見ると、何が起きてるかわかりやすいかなぁと思う。