愚かな私は知りませんでした。
#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)を見ると、何が起きてるかわかりやすいかなぁと思う。