关于C17标准中tmpnam函数“现有文件”定义的技术问询
关于C17标准中
tmpnam函数“现有文件”的范畴解释 tmpnam函数会生成一个有效的文件名,且该文件名与现有文件名不重复。该函数最多可生成至少TMP_MAX个不同的字符串,但其中任意或全部字符串可能已被现有文件占用,因此无法作为合适的返回值。
C17 7.21.4.4.2条款里的“现有文件”,指的是**tmpnam生成的文件名所指向的目标目录下,当前已存在的所有文件**,具体细节如下:
- 目标目录默认是调用进程的当前工作目录(标准未强制其他目录,主流实现均采用当前工作目录)。
- 这里的“现有”不局限于当前进程创建或打开的文件:无论哪个进程创建、是否处于打开状态,只要该目录下存在对应文件名的实体文件,就属于“现有文件”范畴。
- 范围并非整个文件系统:仅针对目标目录内的文件,其他目录下的同名文件不会被纳入判断。
另外需要注意,标准仅保证调用tmpnam的瞬间,生成的名字在目标目录下无对应文件,但由于生成名字到创建文件之间存在时间窗口(可能被其他进程抢占创建同名文件),这也是tmpnam被认为不安全的核心原因之一。
内容的提问来源于stack exchange,提问作者BenevolentDeity
相关产品推荐
相关产品推荐

