open でモードを設定し忘れたら、読み書きできなかった2012年05月14日 11時50分52秒

ちょっとした失敗。open システムコールを使って、ファイルを作成したが、パーミッションを指定するのを忘れていた。そうしたら、--S になっていて、読み書きができない。

open システムコールは、引数が可変で、二つ又は三つの引数を取る。三つ目の引数は、ファイルを作成したときのパーミッションで、二つ目の引数に O_CREAT が入っている時に有効になる。


% cat open.c 
#include <fcntl.h>

int main(int argc, char* argv[])
{
    open(argv[1], O_CREAT | O_WRONLY | O_TRUNC);
}

ファイルが存在しない時の open は、ファイルを作成して、ファイルディスクリプタを返す。書き込み様に開いているので、最初に実験したときは、問題なく書き出せるのだ。

しかし、落とし穴は二回目と読み込み時にある。--S のパーミッションになってしまい、自分で読み書きできない。最初に動かした時は、書いた内容。内容どころか書かれているのをファイルの大きさを見て点検しただけだったので、アクセス権限は全く見逃していた。

そんなこんなで、ファイルの読み書きが失敗しているのに気が付いてみたら、open の仕業。


% cat open.c 
#include <fcntl.h>

int main(int argc, char* argv[])
{
    mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
    open(argv[1], O_CREAT | O_WRONLY | O_TRUNC, mode);
}

これで、自分は読み書き。そして、それ以外は読める。