10

如何抑制来自 gcc 链接器的以下警告:

警告:使用“mktemp”是危险的,最好使用“mkstemp”

我确实知道使用它更好,mkstemp()但由于某种原因我必须使用mktemp()函数。

4

5 回答 5

10

我猜你需要路径,因为你将它传递给一个只接受路径名作为参数而不是文件描述符或FILE指针的库。如果是这样,您可以创建一个临时目录mkdtemp并将您的文件放在那里,那么实际名称并不重要,因为路径由于目录而已经是唯一的。

于 2009-04-12T21:44:25.563 回答
4

如果您必须使用,那么除了从 libc.so.6mktemp中删除使用的部分之外,您无法采取任何措施来抑制该警告。mktemp

为什么一定要使用mktemp

于 2009-04-12T17:48:45.477 回答
4

两件事情:

  • mktemp不是标准功能
  • 该警告是在链接器中作为.gnu.warning.mktemp部分实现的特殊警告

如果您确实需要写入磁盘,请使用本机 OS API。或mkstemp()按照建议。

于 2009-04-12T18:53:37.800 回答
1

如果您静态链接运行时,那么另一个选项是mktemp在目标文件中编写您自己的版本。链接器应该更喜欢您的版本而不是运行时版本。

编辑:感谢 Jason Coco 指出了我mktemp及其亲属的一个重大误解。现在解决这个问题要容易一些。由于链接器会更喜欢目标文件中的版本,因此您只需mktemp按照mkstemp.

唯一的困难是清理将返回给您的文件描述符mkstemp并使一切线程安全。atexit如果您可以限制需要多少临时文件,则可以使用描述符的静态数组和-registered 函数进行清理。如果没有,请改用链表。

于 2009-04-12T18:17:42.240 回答
0

使用mkstemp

int fd = mkstemp(template);

在此调用之后,template将替换为实际的文件名。您将拥有文件描述符和文件的路径。

于 2017-08-14T18:53:31.600 回答