【问题标题】:Where to create a temporary file from within a test [closed]从测试中创建临时文件的位置[关闭]
【发布时间】:2018-04-15 22:15:51
【问题描述】:

我有一个测试,它在标准 cmake/ctest 过程中运行。

问题是我的测试需要创建一个临时文件(不需要在不同的测试中保留它),并且失败并出现EACCES 错误代码。

以下(大概)失败:

m_hFile = open("/tmp/mytest.bin", O_RDWR | O_CREAT);

我是否必须调整与权限相关的内容,或者可能写入另一个位置?

【问题讨论】:

  • 如果已设置,您可能应该使用TMPDIR。如果未设置,则需要找到攻击者无法控制或影响的可写目录。也许~/.tmp/。请注意,GCC Compile Farm 以只读方式挂载/ 并拒绝用户写入访问权限,因此即使/tmp 也是禁止访问的。另请参阅cryptest.sh,我们可以(几乎?)在任何地方使用它,包括 AIX、BSD、OS X、Linux、Solaris。它尝试做的第一件事就是找到一个合适的TMPDIR

标签: c linux ctest


【解决方案1】:

您可以使用 ISO C 函数 tmpfile 创建一个具有自动生成文件名的临时文件。该文件以"wb+" 模式打开。

实现应该自己选择一个可以创建临时文件的目录;在 POSIX 文档中,它指定只有在已经打开的文件句柄太多或磁盘空间不足的情况下才会失败。 (即不可能出现权限错误)。

您还可以使用tmpnam 函数生成唯一的文件名(这不是线程安全的),然后您可以尝试为其创建文件。

【讨论】:

  • 不知道这个功能,很有用,但是tmpnam()看起来没用,甚至用起来也不安全。
  • @Stargateur 是的,您可能不想在生产代码中使用它;使用该名称打开文件可能会因各种原因而失败(例如,其他一些进程同时使用了相同的名称)
  • 谢谢,但我不需要它作为临时文件。它应该支持任何文件,并且测试应该给它一个临时目录中的路径。
  • @valdo 你的问题是“我的测试需要创建一个临时文件(不需要在不同的测试中保留它)”
  • @valdo ??????????????????????你说的没有意义阅读How to Ask
【解决方案2】:

谢谢大家,我找到了问题。

事实证明,如果文件不存在并且应该创建 - 看来我必须指定 mode,并使用 open 的 3 参数版本。

m_hFile = open("/tmp/mytest.bin", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多