なんかのソース(たしかmod_dosdetector)を読んでてCにtmpnam()ってのがあるのを知りました。

なんの関数なんだろうとman tmpnamで調べたらテンポラリーファイル用の関数でした。
プログラムでテンポラリーのファイルを使う場合の名前をよしなに
決定してくれるものらしく、stdio.hで定義されています。
使い方は↓こんな感じにするとs[]にファイル名が入るみたい。
#include <stdio.h>

int main()
{
    char s[L_tmpnam+1];
    tmpnam(s);
    printf("%s\n", s);
    return 0;
}

ためしに実行してみると、
% gcc ./tmpnam_test.c
% ./a.out
/var/tmp/tmp.0.GYj9KF

こんな感じ。あーなんかこのファイル名どこかで見たことあるような…。

上のコードのL_tmpnamってのを配列の大きさにつかってるんだけど、
これもstdio.hに定義されています(Mac OS XやFreeBSDの場合はstdio.h、
CentOSだとbits/stdio_lim.hに定義されていました)。
Mac OS Xだとパスの最大長と同じバイトになってました。


ちなみにCentOSでtmpnam()を使おうとしたら、
% gcc tmpnam_test.c
/tmp/ccwelnuR.o(.text+0x24): In function `main':
: warning: the use of `tmpnam' is dangerous, better use `mkstemp'

って怒られた。デンジャラスだってぇえぇえぇ!

mkstemp()を使えと言ってるので調べてみたら、これも同じような用途に使う関数らしい。 manによると以下のような感じで使うらしい。
#include <stdio.h>
#include <stdlib.h>

int main()
{
    char template[] = "/tmp/fileXXXXXX";
    int fd;
    FILE *fp;

    fd = mkstemp(template);

    if ((fp = fdopen(fd, "w")) == NULL)
        exit(1);

    fprintf(fp, "temp test\n");
    fclose(fp);
    return 0;
}

こうすると「temp test」って内容の/tmp/fileXXXXXX(XXXXXXは毎回違う)という
ファイルが作成されるようだ。

なるほど。
なんかのときに使えそうなので覚えておこう。