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は毎回違う)という
ファイルが作成されるようだ。
なるほど。
なんかのときに使えそうなので覚えておこう。