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

11

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

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

solotim
источник
4
Я очень сомневаюсь, что именно ОС создает эти файлы, в частности, я сомневаюсь, что это конвейерная операция.
@Neil: Очень хорошая мысль. @OP: Вы уверены, что получатель не кэширует данные, которые он получает по стандартному вводу, в файл 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
Кроме того, запись в канал будет блокироваться, если канал слишком заполнен (пока кто-то не прочитает с другого конца).

Ответы:

11
  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

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

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

Рич Гомолка
источник
0

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

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