tmpnam, tmpnam_s
From cppreference.net
|
定义于头文件
<stdio.h>
|
||
|
char
*
tmpnam
(
char
*
filename
)
;
|
(1) | |
|
errno_t tmpnam_s
(
char
*
filename_s, rsize_t maxsize
)
;
|
(2) | (C11 起) |
|
#define TMP_MAX /*unspecified*/
|
||
|
#define TMP_MAX_S /*unspecified*/
|
(C11 起) | |
|
#define L_tmpnam /*unspecified*/
|
||
|
#define L_tmpnam_s /*unspecified*/
|
(C11 起) | |
1)
创建一个唯一的有效文件名(长度不超过
L_tmpnam
),并将其存储到
filename
所指向的字符串中。该函数能够生成最多
TMP_MAX
个唯一文件名,但其中部分或全部可能已被文件系统占用,因此不适合作为返回值。
2)
与
(1)
相同,区别在于最多可生成
TMP_MAX_S
个名称,长度不超过
L_tmpnam_s
,并在运行时检测以下错误,同时调用当前安装的
约束处理函数
:
-
- filename_s 是空指针
- maxsize 大于 RSIZE_MAX
- maxsize 小于生成的文件名字符串长度
-
与所有边界检查函数一样,仅当实现定义了
__STDC_LIB_EXT1__
且用户在包含
<stdio.h>
之前将
__STDC_WANT_LIB_EXT1__
定义为整型常量
1
时,才保证
tmpnam_s可用。
tmpnam 和 tmpnam_s 会修改静态状态(这些函数之间可能共享该状态),且不要求具备线程安全性。
目录 |
参数
| filename | - | 指向至少能容纳 L_tmpnam 字节的字符数组的指针,用作结果缓冲区。若传入空指针,则返回指向内部静态缓冲区的指针。 |
| filename_s | - | 指向至少能容纳 L_tmpnam_s 字节的字符数组的指针,用作结果缓冲区。 |
| maxsize | - |
函数允许写入的最大字符数(通常是
filename_s
数组的大小)。
|
返回值
1)
filename
如果
filename
不是空指针。否则返回指向内部静态缓冲区的指针。如果无法生成合适的文件名,则返回空指针。
2)
成功时返回零并将文件名写入
filename_s
。出错时返回非零值,并将空字符写入
filename_s
[
0
]
(仅当
filename_s
非空且
maxsize
非零且不大于
RSIZE_MAX
时)。
注释
尽管
tmpnam
生成的名称难以猜测,但在
tmpnam
返回结果与本程序尝试使用该名称创建文件的时间间隔内,仍可能存在其他进程创建同名文件的情况。标准函数
tmpfile
和POSIX函数
mkstemp
不存在此问题(若仅使用标准C库创建唯一目录,仍需要借助
tmpnam
实现)。
POSIX 系统额外定义了名称相似的函数
tempnam
,该函数支持选择目录(默认使用可选定义的宏
P_tmpdir
)。
示例
运行此代码
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { // 注意:编译器/链接器可能会发出安全警告,例如 GCC: // "警告:使用 `tmpnam` 存在风险,建议改用 `mkstemp`" char* name1 = tmpnam(NULL); printf("临时文件名:%s\n", name1); char name2[L_tmpnam]; if (tmpnam(name2)) printf("临时文件名:%s\n", name2); // POSIX 提供 mkstemp。由于标准 C <stdlib.h> 中可能未包含 mkstemp, // 可能需要以下声明。 int mkstemp(char*); char name3[] = "/tmp/fileXXXXXX"; // 至少需要六个 'X' ^_^ int file_descriptor = mkstemp(name3); if (file_descriptor != -1) printf("临时文件名:%s\n", name3); else perror("mkstemp"); }
可能的输出:
临时文件名:/tmp/file90dLlR 临时文件名:/tmp/fileY9LWAg 临时文件名:/tmp/filexgv8PF
参考文献
- C23 标准 (ISO/IEC 9899:2024):
-
- 7.21.4.4 tmpnam 函数 (页: TBD)
-
- K.3.5.1.2 tmpnam_s 函数 (页: TBD)
- C17 标准 (ISO/IEC 9899:2018):
-
- 7.21.4.4 tmpnam 函数 (页: 222)
-
- K.3.5.1.2 tmpnam_s 函数 (页: 427-428)
- C11 标准 (ISO/IEC 9899:2011):
-
- 7.21.4.4 tmpnam 函数 (第 303-304 页)
-
- K.3.5.1.2 tmpnam_s 函数 (第 587-588 页)
- C99标准(ISO/IEC 9899:1999):
-
- 7.19.4.4 tmpnam函数(页码:269-270)
- C89/C90 标准 (ISO/IEC 9899:1990):
-
- 4.9.4.4 tmpnam 函数
参考
|
(C11)
|
返回指向临时文件的指针
(函数) |
|
C++ documentation
for
tmpnam
|
|