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