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

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

#include <stdio.h><br /> #include <unistd.h><br /> #include <sys/types.h><br /> #include <sys/stat.h><br /> #include <fcntl.h></p> <p>char data[] = &#8220;test\n&#8221;;</p> <p>int main(int argc, char **argv)<br /> {<br /> int f, r;<br /> if(argc!=2){<br /> printf(&#8220;Usage: %s filename\n&#8221;, argv[0]);<br /> exit(1);<br /> }<br /> f=creat(argv[1], 0444); // open(argv[1], O_WRONLY|O_CREAT|O_TRUNC, 0444);<br /> if(f==-1){<br /> perror(&#8220;creat&#8221;);<br /> exit(1);<br /> }<br /> r=write(f, data, sizeof(data));<br /> printf(&#8220;write return: %d\n&#8221;, r);<br /> return 0;<br /> }<br />

で、

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です