Труба должна записать временный файл?

5921
solotim

Я обнаружил, что если я передаю большое количество данных между двумя процессами через канал, временный файл будет создан linux в каталоге / tmp. Если операция конвейера завершится успешно, соответствующий временный файл будет автоматически удален ОС. Но если операция не удалась, файл tmp остается там.

По какой-то причине я не хочу, чтобы у пользователя была возможность получать данные, которые я передал через канал, поэтому я не хочу, чтобы что-либо оставалось на жестком диске, даже если моя программа потерпела крах. Как я могу это сделать?

10
Я очень сомневаюсь, что именно ОС создает эти файлы, в частности, я сомневаюсь, что это конвейерная операция. 14 лет назад 3
@Neil: Очень хорошая мысль. @OP: Вы уверены, что получатель не кэширует данные, которые он получает по стандартному вводу, в файл tmp? Если это не ваш собственный код и не открытый исходный код, вы, вероятно, можете проверить, перенаправив выходные данные отправителя в файл, а затем отправив их в процесс получателя в качестве входного потока, например: `sender> filename` then` receive < filename`. Я проверял бы файл tmp во время обеих операций, чтобы видеть, делает ли это отправитель или получатель. 14 лет назад 0
Не ответ, но я нашел много полезной информации об обработке канала здесь: , Не знаю, насколько авторитетен этот человек, но он специально упоминает, что канал, созданный `mkfifo`, никогда не выполняет буферизацию (вообще!) И никогда не создает файлы. Carl Smotricz 14 лет назад 2
@Carl Smotricz: ссылка не работает, поэтому здесь: http://slacy.com/blog/2008/12/on-mkfifo-and-doing-the-impossible/ 14 лет назад 1
Кроме того, запись в канал будет блокироваться, если канал слишком заполнен (до тех пор, пока кто-то не прочитает с другого конца). 14 лет назад 0

3 ответа на вопрос

11
Peter Cordes
  1. трубы не хранят данные на диске. / bin / echo foo | grep bar не создает файлов. попытаться strace -f sh -c '/bin/echo foo | grep bar' увидеть все системные вызовы, сделанные оболочкой при запуске конвейера. echoэто встроенная оболочка, поэтому я предложил /bin/echoсделать ее исполняемой.

  2. /tmpне должно быть на диске. Он может быть смонтирован на tmpfs (т.е. поддерживается виртуальной памятью). Обратите внимание, что /tmpв этом случае перезагрузка будет пустой, поэтому используйте /var/tmpвсе, что вы хотите оставить.

Если то, что вы делаете, это помещает данные в файл, тогда он не использует канал. Если файл представляет собой fifo, а не обычный файл, то это просто именованное рандеву и не содержит данных. Используйте ls -l, чтобы узнать.

И обратите внимание, что если вы хотите помешать пользователям видеть, что происходит по каналам в процессах, которыми они владеют, вы в значительной степени SOL, потому что straceможете проверять все, что делает процесс, взаимодействующий с чем-либо вне процесса, кроме чтения / записи mmapped shared объем памяти. ltraceеще более агрессивен. Если ваша программа будет работать в системах, где у локального пользователя есть root, вы вообще не сможете их остановить. В Unix root может делать все что угодно и имеет для этого мощные инструменты.

1
Rich Homolka

Истинный канал - это блок памяти в ядре, буфер, который читается / записывается некоторыми процессами. Он не создает файлы нигде.

В некоторых приложениях есть опции, которые переключаются между использованием каналов (быстрее, без попадания на диск, занимает немного больше памяти) и использованием временных файлов (занимает немного меньше памяти, позволяет вам видеть временные файлы, на ощупь медленнее). gccявляется одним из таких приложений, хотя, вероятно, другие.

0
Senad Uka

Грязный хак: зашифруйте данные перед отправкой и расшифруйте их при получении, если вы можете изменить оба процесса ...

На самом деле не будет называть это грязным взломом: если данные чувствительны, кажется подходящим решением. Но мне любопытно насчет файла tmp. Прав ли ОП, что ядро ​​его создает? Или Нил прав, и это один конец трубы или другой ... 14 лет назад 0
Ядро не создает временный файл. С другой стороны, очень вероятно, что процесс получения создает временный файл. Это довольно распространенное явление, так как если вы хотите искать в своем вводе, вам сначала нужно записать его в файл. larsks 14 лет назад 0

Похожие вопросы