Чи має труба писати тимчасовий файл?


11

Я виявив, що якщо я перенесу велику кількість даних між двома процесами через pipe, Linux створить якийсь тимчасовий файл у каталозі / tmp. Якщо робота з трубою пройде успішно, відповідний тимчасовий файл буде видалений ОС автоматично. Але якщо операція не вдалася, файл tmp залишається там.

З якоїсь причини я не хочу, щоб користувач мав можливість отримувати дані, які я передавав trhough pipe, тому я не хочу нічого залишати на жорсткому диску, навіть якщо моя програма вийшла з ладу. Як я можу це зробити?


4
Я дуже сумнівно, що саме ОС створює ці файли, зокрема, я сумніваюся, що це робота труби.

@Neil: Дуже добре. @OP: Ви впевнені, що приймач не кешує дані, які він отримує на stdin, у файл tmp? Якщо це не ваш власний код і не є відкритим кодом, ви, ймовірно, можете перевірити, перенаправивши свій вихідний дані від вашого відправника до файлу, а потім надіславши його в процес приймача як його вхідний потік, наприклад: sender > filenameтоді 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. Труби не зберігають дані на диску. / бін / відлуння | греп-панель не створює жодних файлів. спробуйте strace -f sh -c '/bin/echo foo | grep bar' побачити всі системні виклики, зроблені оболонкою, під час запуску конвеєра. echoце вбудована оболонка, тому я запропонував /bin/echoзробити оболонку запущеною у виконанні.

  2. /tmpне має бути на диску. Він може бути встановлений на tmpfs (тобто підкріплений віртуальною пам'яттю). Зауважте, що /tmpв цьому випадку перезавантаження буде порожньою , тому використовуйте /var/tmpвсе, що хочете залишити.

Якщо ви робите це введення даних у файл, то це не використання труби. Якщо файл - це фіфо, а не звичайний файл, то це лише названий рандеву і не містить даних. Використовуйте ls -l, щоб дізнатися це.

І зауважте, що якщо ви сподіваєтесь перешкоджати користувачам бачити, що відбувається через труби у власних процесах, ви в значній мірі SOL, тому що straceможете перевірити все, що робить процес, що взаємодіє з чим-небудь поза процесом, за винятком читання / запису mmapped shared пам'ять. ltraceє ще більш інвазивним. Якщо ваша програма буде працювати в системах, де локальний користувач має root, ви не можете їх взагалі зупинити. У Unix root може робити все, що завгодно, і має потужні інструменти для цієї мети.


1

Справжня труба - це блок пам'яті в ядрі, буфер, який читається / записується деякими процесами. Він ніде не створює файли.

У деяких додатках є параметри, які перемикаються між трубами (швидше, без удару диска, займає трохи більше пам’яті) та використанням тимчасових файлів (займає трохи менше пам’яті, дозволяє, можливо, бачити тимчасові файли, на дотик повільніше). gccє одним із таких додатків, хоча, ймовірно, є й інші.


0

Брудний злом: зашифруйте дані перед надсиланням та розшифруйте їх при отриманні, якщо ви можете змінити обидва процеси ...


Насправді це не називатиметься брудним злом: якщо дані є конфіденційними, це здається відповідним рішенням. Але мені цікаво файл tmp. Чи правильно ОП, що ядро ​​його створює? Або Ніл правий, і це один кінець труби, або інший ...

Ядро не створює тимчасовий файл. З іншого боку, дуже ймовірно, що процес прийому створює тимчасовий файл. Це досить поширене явище, оскільки, якщо ви хочете шукати свої дані, потрібно спочатку записати його у файл.
larsks
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.