【发布时间】:2020-02-26 20:58:39
【问题描述】:
我在 Unix 环境中(Sun Ultra 5 和 gcc v.2.95.3),我试图了解我的编译器使用 tmpnam 函数在哪里写入临时文件。我知道这项工作已被弃用,但我只是好奇。 我的行为是这样的: 我在 c 中运行了这个源代码:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char nomefile[L_tmpnam];
strcpy(nomefile, "my_file.txt");
tmpnam(nomefile);
getchar();
return(0);
}
在等待按下返回键时,程序应该创建一个名为 my_file.txt 的临时文件(在文件系统的某个位置)。所以从另一个终端我以这种方式开始搜索(作为超级用户):
find / -name my_file.txt -print
不幸的是,它没有找到它。然而在我正在阅读的书中,它说这个函数(tmpnam)与 tmpfile 函数不同,您可以指定临时文件的名称并将其写入文件系统中的某个位置。
【问题讨论】:
-
使用
strace your_program看看它做了什么。顺便说一句:临时文件在挂载的文件系统中可能不可见。 -
不幸的是,它给了我一个错误:# strace a.out -> 错误:无法打开 /dev/log... 我以超级用户身份尝试并给了我另一个错误:错误:跟踪器已经存在
-
...程序应该创建一个临时文件...。实际上,
tmpnam不会创建文件。它使用您提供的字符串作为基础创建一个唯一的文件名,并返回指向该名称的指针,然后您可以将其用作临时文件的名称。看来你没用过。你在你的系统上检查了man tmpnam吗? -
@wildplasser:Solaris 的
strace命令的作用与您的预期不同。用于跟踪系统调用的 Solaris 命令,类似于 Linux 的strace,称为truss。 -
@lurker:实际上我不认为它使用字符串作为名称的基础。它从头开始生成名称并将其存储在给定的缓冲区中,其先前的内容被忽略并覆盖。你可能会想到
tempnam。
标签: c gcc temp solaris-10 sun