揮発性のメモ2

http://d.hatena.ne.jp/iww/

ファイルを新規作成するとき、仮ファイルを作って書ききってからリネームする

ファイルを新規作成するとき、仮ファイルを作って書ききってからリネームすると、
書いてる途中のファイルを「お、あるある」とか言って読まれないので比較的安全

#include <stdio.h>
#include <stdlib.h> // mkstemp
#include <unistd.h> // write

int main()
{
    // 仮ファイルを作って本文を書く
    char tmpname[] = "/tmp/unko_XXXXXX";
    int fd = mkstemp(tmpname);
    write(fd, "hello\n", 6);
    close(fd);

    // 目的のファイル名にリネームする
    int result = rename(tmpname, "/tmp/hoge.txt");
    if(result) perror("rename");

    return 0;
}


Man page of MKSTEMP
mkstemp() は、一時ファイルをオープンできる
そのとき、引数に書いた一時ファイル名の末尾の XXXXXX の部分を書き換えてユニークな名前を作ってくれる
(つまり、書き換えてくるので const char * はダメ)
(末尾以外に書いても無駄。 /tmp/unko_XXXXXX.txt みたいなのは作れない)

Man page of RENAME
すっかり忘れてたけど、ファイルシステムを跨げないので注意する