Я обнаружил, что если я передаю большое количество данных между двумя процессами по каналу, временный файл будет создан linux в каталоге / tmp. Если операция конвейера завершится успешно, соответствующий временный файл будет автоматически удален ОС. Но если операция не удалась, файл tmp остается там.
По какой-то причине я не хочу, чтобы у пользователя была возможность получать данные, которые я передал через канал, поэтому я не хочу, чтобы что-либо оставалось на жестком диске, даже если моя программа потерпела крах. Как я могу это сделать?
sender > filename
thenreceiver < filename
. Я проверял бы файл tmp во время обеих операций, чтобы видеть, делает ли это отправитель или получатель.mkfifo
созданный канал никогда не выполняет буферизацию (вообще!) И никогда не создает файлы.Ответы:
трубы не хранят данные на диске. / bin / echo foo | grep bar не создает файлов. попытаться
strace -f sh -c '/bin/echo foo | grep bar'
увидеть все системные вызовы, сделанные оболочкой при запуске конвейера.echo
это встроенная оболочка, поэтому я предложил/bin/echo
сделать ее исполняемой./tmp
не должно быть на диске. Он может быть смонтирован на tmpfs (т.е. поддерживается виртуальной памятью). Обратите внимание, что/tmp
в этом случае перезагрузка будет пустой , поэтому используйте/var/tmp
все, что вы хотите оставить.Если то, что вы делаете, это помещает данные в файл, тогда он не использует канал. Если файл представляет собой fifo, а не обычный файл, то это просто именованное рандеву и не содержит данных. Используйте ls -l, чтобы узнать.
И обратите внимание, что если вы надеетесь не дать пользователям увидеть, что происходит по каналам в процессах, которыми они владеют, вы в значительной степени SOL, потому что
strace
можете проверять все, что делает процесс, взаимодействующий с чем-либо вне процесса, кроме чтения / записи mmapped shared Память.ltrace
еще более агрессивен. Если ваша программа будет работать в системах, где у локального пользователя есть root, вы вообще не сможете их остановить. В Unix root может делать все что угодно и имеет для этого мощные инструменты.источник
Истинный канал - это блок памяти в ядре, буфер, который читается / записывается некоторыми процессами. Он не создает файлы нигде.
Некоторые приложения имеют опции, которые переключаются между использованием каналов (быстрее, без удара по диску, занимает немного больше памяти) и использованием временных файлов (занимает немного меньше памяти, позволяет вам видеть временные файлы, на ощупь медленнее).
gcc
является одним из таких приложений, хотя, вероятно, другие.источник
Грязный хак: зашифруйте данные перед отправкой и расшифруйте их при получении, если вы можете изменить оба процесса ...
источник