Pipe geçici dosya yazmak zorunda mı?


11

İki işlem arasında büyük miktarda veriyi boru yoluyla aktarırsam, linux tarafından / tmp dizininde bazı geçici dosyaların oluşturulacağını buldum. Boru işlemi başarılı olursa, ilgili geçici dosya işletim sistemi tarafından otomatik olarak kaldırılır. Ancak işlem başarısız olursa, tmp dosyası orada kalır.

Nedense, ben kullanıcı boru rağmen aktardığım veri almak için fırsat istemiyorum, bu yüzden programım çökse bile sabit disk üzerinde hiçbir şey istemiyorum. Bunu nasıl yapabilirim?


4
Bu dosyaları oluşturan işletim sistemi olduğundan çok şüpheliyim, özellikle de boru işlemi olduğundan şüpheliyim.

@Neil: Çok iyi bir nokta. @OP: Alıcının stdin'de aldığı verileri tmp dosyasına önbelleğe almadığından emin misiniz? : Kendi kod ve açık kaynak değil, muhtemelen örneğin bir dosyaya gönderenden gelen çıkış yönlendirme ve sonra onun giriş akışı olarak alıcı sürecine bu göndererek kontrol edebilirsiniz sender > filenamesonra receiver < filename. Her iki ops sırasında da gönderen veya alıcının yapılıp yapılmadığını görmek için tmp dosyasını kontrol ederim.

2
Yanıt değil, ama burada boru taşıma hakkında birçok yararlı bilgi buldum: < slacy.com/blog/2008/12/on-mkfifo-and-doing-the-impossible >. Bu kişinin ne kadar yetkili olduğunu bilmiyorum, ama özellikle oluşturulmuş bir mkfifoborunun hiçbir zaman tamponlama yapmadığını (hiç!) Ve asla dosya oluşturmadığını belirtiyor .
Carl Smotricz

1
@Carl Smotricz: Bağlantı koptu, işte burada: slacy.com/blog/2008/12/on-mkfifo-and-doing-the-impossible

Ayrıca, bir boruya yazmak, boru çok dolu olduğunda (birisi diğer uçtan okuyana kadar) engellenir.

Yanıtlar:


11
  1. borular diskte veri depolamaz. / bin / echo foo | grep bar hiçbir dosya oluşturmuyor. strace -f sh -c '/bin/echo foo | grep bar' bir boru hattı çalıştırılırken kabuk tarafından yapılan tüm sistem çağrılarını görmeye çalışın . echobir kabuk yerleşik, bu yüzden /bin/echokabuğu çalıştırılabilir yapmak için önerdi .

  2. /tmpdiskte olması gerekmez. Tmpfs üzerine monte edilebilir (yani sanal bellek ile desteklenir). /tmpBu durumda yeniden başlatmanın boşaltılacağını unutmayın , bu yüzden /var/tmpetrafında bırakmak istediğiniz herhangi bir şey için kullanın .

Yaptığınız şey bir dosyaya veri koymaksa, o zaman bir pipo kullanmaz. Dosya normal bir dosya değil, bir fifo ise, yalnızca adlandırılmış bir buluşma noktasıdır ve veri içermez. Öğrenmek için ls -l kullanın.

Ayrıca, kullanıcıların sahip oldukları işlemlerde borulardan neler geçtiğini görmesini durdurmayı straceumuyorsanız , hemen hemen SOL olduğunuzu unutmayın, çünkü bir işlemin süreç dışındaki herhangi bir şeyle etkileşime giren, paylaşılan mmapped okuma / yazma hariç her şeyi inceleyebilir hafıza. ltracedaha da istilacı. Programınız yerel kullanıcının kökü olan sistemlerde çalışacaksa, onları durduramazsınız. Unix'te, kök her şeyi yapabilir ve amaç için güçlü araçlara sahiptir.


1

Gerçek bir boru, çekirdekte bir bellek bloğudur, bazı süreçler tarafından okunan / yazılan bir tampon. Hiçbir yerde dosya oluşturmaz.

Bazı uygulamalarda, boruları kullanma (daha hızlı, isabetsiz disk yok, biraz daha fazla bellek alır) ve geçici dosyaları kullanma (biraz daha az bellek alır, geçici dosyaları, dokunma yavaşlığını görmenizi sağlar) arasında geçiş yapan seçenekler vardır. gccmuhtemelen başkaları olsa da, böyle bir uygulama.


0

Kirli kesmek: Her iki işlemi de değiştirebilirseniz, göndermeden önce verileri şifreleyin ve alma şifresini çözün ...


Buna kirli bir saldırı demezdim: Veriler hassassa, uygun bir çözüm gibi görünüyor. Ama tmp dosyasını merak ediyorum. OP çekirdeğin oluşturduğu doğru mu? Yoksa Neil haklı ve borunun bir ucu ya da diğeri ...

Çekirdek geçici bir dosya oluşturmuyor. Öte yandan, alma işleminin geçici bir dosya oluşturması büyük olasılıktır. Bu oldukça yaygındır, çünkü girdilerinizde arama yapmak istiyorsanız önce bir dosyaya yazmanız gerekir.
larsks
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.