Apakah pipa harus menulis file sementara?

11

Saya menemukan bahwa jika saya mentransfer sejumlah besar data antara dua proses melalui pipa, beberapa file sementara akan dibuat oleh linux di direktori / tmp. Jika operasi pipa berhasil, file sementara yang sesuai akan dihapus oleh OS secara otomatis. Tetapi jika operasi gagal, file tmp tetap ada.

Untuk beberapa alasan, saya tidak ingin pengguna memiliki kesempatan untuk mendapatkan data yang saya transfer melalui pipa, jadi saya tidak ingin ada yang tertinggal di harddisk walaupun program saya macet. Bagaimana saya bisa melakukan ini?

solotim
sumber
4
Saya sangat ragu bahwa itu adalah OS yang membuat file-file ini, terutama, saya ragu itu adalah operasi pipa.
@ Neil: Poin yang sangat bagus. @OP: Apakah Anda yakin penerima tidak menyimpan data yang diterimanya di stdin ke file tmp? Jika bukan kode Anda sendiri dan bukan sumber terbuka, Anda mungkin dapat memeriksa dengan mengarahkan output dari pengirim ke file, dan kemudian mengirimkannya ke proses penerima sebagai aliran inputnya, misalnya: sender > filenamelalu receiver < filename. Saya akan memeriksa file tmp selama kedua ops, untuk melihat apakah pengirim atau penerima melakukannya.
2
Bukan jawaban, tetapi saya menemukan banyak informasi berguna tentang penanganan pipa di sini: < slacy.com/blog/2008/12/on-mkfifo-and-doing-the-impossible >. Tidak tahu seberapa otoritatif orang ini, tetapi ia secara khusus menyebutkan bahwa mkfifopipa -created tidak pernah melakukan buffering (sama sekali!) Dan tidak pernah membuat file.
Carl Smotricz
1
@Carl Smotricz: Tautan rusak, jadi di sini: slacy.com/blog/2008/12/on-mkfifo-and-doing-the-impossible
Juga, menulis ke pipa akan menghalangi jika pipa terlalu penuh (sampai seseorang membaca dari ujung yang lain).

Jawaban:

11
  1. pipa tidak menyimpan data pada disk. / bin / echo foo | grep bar tidak membuat file apa pun. coba strace -f sh -c '/bin/echo foo | grep bar' lihat semua panggilan sistem yang dibuat oleh shell saat menjalankan pipa. echoadalah shell bawaan, jadi saya menyarankan /bin/echoagar shell menjalankan executable.

  2. /tmptidak harus di disk. Itu dapat dipasang pada tmpfs (yaitu didukung oleh memori virtual). Perhatikan bahwa reboot akan kosong /tmpdalam kasus itu, jadi gunakan /var/tmpuntuk apa pun yang ingin Anda tinggalkan.

Jika yang Anda lakukan adalah memasukkan data ke file, maka itu tidak menggunakan pipa. Jika file tersebut adalah fifo, bukan file biasa, maka itu hanya pertemuan yang dinamai, dan tidak mengandung data. Gunakan ls-l untuk mencari tahu.

Dan perhatikan bahwa jika Anda berharap untuk menghentikan pengguna dari melihat apa yang terjadi melalui pipa dalam proses yang mereka miliki, Anda cukup banyak SOL, karena stracedapat memeriksa segala sesuatu yang dilakukan proses yang berinteraksi dengan apa pun di luar proses, kecuali untuk membaca / menulis yang dibagikan bersama Penyimpanan. ltracebahkan lebih invasif. Jika program Anda akan berjalan pada sistem di mana pengguna lokal memiliki root, Anda tidak dapat menghentikannya sama sekali. Di Unix, root dapat melakukan apa saja, dan memiliki alat yang kuat untuk tujuan itu.

Peter Cordes
sumber
1

Pipa sejati adalah blok memori dalam kernel, buffer yang dibaca / ditulis oleh beberapa proses. Itu tidak membuat file di mana saja.

Beberapa aplikasi memiliki opsi yang beralih di antara menggunakan pipa (lebih cepat, tidak ada cakram, membutuhkan sedikit lebih banyak memori) dan menggunakan file temp (mengambil memori sedikit lebih sedikit, memungkinkan Anda untuk melihat file temp, sentuhan lebih lambat). gccadalah salah satu aplikasi tersebut, meskipun mungkin yang lain.

Homolka yang kaya
sumber
0

Retasan kotor: Enkripsi data sebelum mengirim dan mendekripsi saat menerima jika Anda dapat mengubah kedua proses ...

Senad Uka
sumber
Tidak akan menyebutnya hack kotor, sebenarnya: Jika data sensitif, tampaknya solusi yang tepat. Tapi saya ingin tahu tentang file tmp. Apakah OP benar bahwa kernel membuatnya? Atau Neil benar dan itu salah satu ujung pipa atau yang lain ...
Kernel tidak membuat file sementara. Di sisi lain, sangat mungkin bahwa proses penerimaan membuat file sementara. Ini cukup umum, karena jika Anda ingin mencari di input Anda, Anda harus menulisnya ke file terlebih dahulu.
larsks