管道必须写入临时文件吗?


11

我发现,如果我通过管道在两个进程之间传输大量数据,则linux将在/ tmp目录中创建一些临时文件。如果管道操作成功,则操作系统将自动删除相应的临时文件。但是,如果操作失败,则tmp文件将保留在那里。

由于某些原因,我不希望用户有机会获取通过管道传输的数据,因此即使程序崩溃,我也不想在硬盘上留下任何东西。我怎样才能做到这一点?


4
我非常怀疑是操作系统在创建这些文件,特别是我怀疑这是管道操作。

@Neil:非常好。@OP:您确定接收者没有将在stdin上接收到的数据缓存到tmp文件中吗?如果不是您自己的代码且不是开源的,则可以通过将输出从发送方重定向到文件,然后将其作为输入流发送到接收方进程中来进行检查,例如:sender > filenamethen receiver < filename。我将在两次操作期间检查tmp文件,以查看发送方或接收方是否正在执行此操作。

2
没有答案,但是我在这里找到了许多有关管道处理的有用信息:< slacy.com/blog/2008/12/on-mkfifo-and-doing-the-impossible >。不知道这个人的权威性,但是他特别提到- mkfifo创建的管道永远不会做任何缓冲,也永远不会创建文件。
卡尔·斯莫特里奇

1
@Carl Smotricz:链接已断开,所以在这里:slacy.com/blog/2008/12/on-mkfifo-and-doing-the-impossible

另外,如果管道太满(直到有人从另一端读取),则写入管道会阻塞。

Answers:


11
  1. 管道不在磁盘上存储数据。/ bin / echo foo | grep bar不会创建任何文件。尝试 strace -f sh -c '/bin/echo foo | grep bar' 在运行管道时查看shell进行的所有系统调用。 echo是内置的Shell,因此我建议/bin/echo使Shell运行可执行文件。

  2. /tmp不必在磁盘上。可以将其安装在tmpfs上(即由虚拟内存支持)。请注意,/tmp在这种情况下,重新启动将为空,因此请使用/var/tmp任何您想留下的东西。

如果您要执行的操作是将数据放入文件中,则说明它没有使用管道。如果文件是fifo,而不是常规文件,则它只是一个命名的集合点,并且不包含数据。使用ls -l查找。

并请注意,如果您希望阻止用户查看他们所拥有的流程在管道中的运行情况,那么您就是SOL,因为strace可以检查流程所做的一切与流程之外的任何事物进行交互,除了读取/写入映射的共享记忆。 ltrace更具侵略性。如果您的程序将在本地用户具有root用户的系统上运行,则根本无法停止它们。在Unix上,root可以执行任何操作,并且具有用于此目的的强大工具。


1

真正的管道是内核中的一块内存,是某些进程读取/写入的缓冲区。它不会在任何地方创建文件。

某些应用程序具有以下选项:在使用管道(更快,没有命中磁盘,占用更多内存)和使用临时文件(占用更少的内存,使您可能看到临时文件(稍慢一些))之间切换。 gcc是一个这样的应用程序,尽管可能是其他应用程序。


0

脏乱:如果可以同时更改两个过程,则在发送之前先对数据进行加密,然后在接收时对其进行解密...


实际上,这不会被称为肮脏的黑客:如果数据是敏感的,似乎是一个合适的解决方案。但是我对tmp文件很好奇。内核创建OP的权利对吗?还是尼尔正确,那是管道的另一端?

内核未创建临时文件。另一方面,接收过程很可能正在创建一个临时文件。这是很常见的,因为如果要查找输入内容,则需要先将其写入文件。
larsks
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.