【问题标题】:Where does the tmpname function write temporary files in a Sun Solaris environment?tmpname 函数在 Sun Solaris 环境中将临时文件写入何处?
【发布时间】: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


【解决方案1】:

识别临时文件写入位置的正确来源如下。正如 cmets 中向我建议的那样。

#include <stdio.h>

int main(void) {
    char buffer[L_tmpnam] = "my_file.txt";
    char *ptr;

    tmpnam(buffer);
    printf("Temporary name 1: %s\n", buffer);

    ptr = tmpnam(NULL);
    printf("Temporary name 2: %s\n", ptr);

    return(0);
}

输出:

Temporary name 1: /var/tmp/aaagXay5b
Temporary name 2: /var/tmp/baahXay5b

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 2013-12-06
    • 2012-09-20
    • 2010-11-10
    • 1970-01-01
    • 2012-10-27
    相关资源
    最近更新 更多