名称
tmpnam, tmpnam_r - 为临时文件创建名称
概要
#include <stdio.h>
char *tmpnam(char *s);
说明
注意:应该避免使用tmpnam,请改用mkstemp或tmpfile。
tmpnam返回一个指向字符串的指针,该字符串是一个有效的文件名,并且在某个
时间点不存在同名的文件,因此天真的程序员可能认为临时文件适合使用该名字。
如果参数s为 NULL,则此名称在内部静态缓冲区中生成,并且可能会被下一次调
用tmpnam覆盖。如果参数s不为NULL,则将名称复制到s指向的字符数组(长
度至少为L_tmpnam)中,且在成功时返回s。
创建的路径名具有目录前缀P_tmpdir。(L_tmpnam和P_tmpdir都定义在<stdio.h>
中,就像下文提到的TMP_MAX。)
返回值
tmpnam返回一个指向唯一临时文件名的指针,如果无法生成唯一名称,则返回
NULL。
错误码
没有定义错误。
线程安全特征
接口 | 特征 | 值 |
tmpnam() | 线程安全 | 多线程不安全,竞争:tmpnam/!s |
tmpnam_r() | 线程安全 | 多线程安全 |
标准
遵循SVr4, 4.3BSD, C89, C99, POSIX.1-2001。POSIX.1-2008将tmpnam标记为已过时。
注意
每次调用tmpnam都会生成不同的字符串,最多TMP_MAX次。如果调用次数超过
TMP_MAX次,则行为由具体实现定义。
尽管tmpnam生成的名称难以猜测,但仍有可能在tmpnam返回路径名和程序打开
它之间的这段时间,另一个程序使用open创建了该路径名,或者将其创建为符号
链接。这可能会导致安全漏洞。为避免这种可能性,请使用open O_EXCL标志打开
路径名,或者更好的办法是调用mkstemp或tmpfile。
如果定义了_POSIX_THREADS或_POSIX_THREAD_SAFE_FUNCTIONS,则多线程应用程
序不能使用NULL为参数调用tmpnam。
POSIX草案提议使用tmpnam_r,定义如下,
char *
tmpnam_r(char *s)
{
return s ? tmpnam(s) : NULL;
}
这显然是警告不要使用NULL。一些系统实现tmpnam_r,如果要从<stdio.h>获取此
函数的glibc原型,请定义_SVID_SOURCE或_BSD_SOURCE(在包含任何头文件之前)。
BUGS
永远不要使用该函数,改用mkstemp或tmpfile。
推荐阅读
mkstemp,mktemp,tempnam,tmpfile
版本记录
这个页面是Linux man-pages项目4.04版本的一部分。关于该项目的信息和bug报
道可以在该网站找到:http://www.kernel.org/doc/man-pages/。
2015-03-02