ไปป์ต้องเขียนไฟล์ชั่วคราวหรือไม่?


11

ฉันพบว่าถ้าฉันถ่ายโอนข้อมูลจำนวนมากระหว่างสองกระบวนการผ่านไพพ์ไฟล์ชั่วคราวบางไฟล์จะถูกสร้างโดย linux ในไดเร็กทอรี / tmp หากการดำเนินการไพพ์สำเร็จระบบไฟล์ชั่วคราวที่เกี่ยวข้องจะถูกลบออกโดยอัตโนมัติ แต่หากการดำเนินการล้มเหลวไฟล์ tmp จะยังคงอยู่

ด้วยเหตุผลบางอย่างฉันไม่ต้องการให้ผู้ใช้มีโอกาสที่จะได้รับข้อมูลที่ฉันถ่ายโอนไปป์ trhough ดังนั้นฉันจึงไม่ต้องการอะไรที่เหลืออยู่ในฮาร์ดดิสก์แม้ว่าโปรแกรมของฉันจะล้มเหลว ฉันจะทำสิ่งนี้ได้อย่างไร


4
ฉันสงสัยมากว่ามันเป็นระบบปฏิบัติการที่สร้างไฟล์เหล่านี้โดยเฉพาะฉันสงสัยว่ามันเป็นการทำงานของไปป์

@ Neil: จุดที่ดีมาก @OP: คุณแน่ใจหรือไม่ว่าผู้รับไม่ได้แคชข้อมูลที่ได้รับจาก stdin ไปยังไฟล์ tmp? หากยังไม่ได้รหัสของคุณเองและแหล่งที่มาไม่ได้เปิดคุณอาจจะสามารถตรวจสอบได้โดยเปลี่ยนเส้นทางออกของคุณจากผู้ส่งไปยังแฟ้มและจากนั้นส่งเข้าสู่กระบวนการที่รับเป็นกระแสอินพุทของตนเช่นนั้นsender > filename receiver < filenameฉันจะตรวจสอบไฟล์ tmp ระหว่าง ops ทั้งสองเพื่อดูว่าผู้ส่งหรือผู้รับกำลังทำอยู่หรือไม่

2
ไม่ใช่คำตอบ แต่ฉันพบข้อมูลที่เป็นประโยชน์มากมายเกี่ยวกับการจัดการท่อที่นี่: < slacy.com/blog/2008/12/on-mkfifo-and-doing-the-impossible > ไม่ทราบว่าบุคคลนี้มีอำนาจเพียงใด แต่เขากล่าวถึงว่าmkfifoท่อที่สร้างขึ้นจะไม่ทำการบัฟเฟอร์ใด ๆ (เลย!) และไม่เคยสร้างไฟล์
คาร์ล Smotricz

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เป็น shell builtin ดังนั้นฉันแนะนำ/bin/echoให้ทำให้ shell นั้นรันได้

  2. /tmpไม่จำเป็นต้องอยู่บนดิสก์ สามารถติดตั้งบน tmpfs (เช่นสำรองข้อมูลโดยหน่วยความจำเสมือน) โปรดทราบว่าการรีบูตจะว่างเปล่า/tmpในกรณีนั้นดังนั้นให้ใช้/var/tmpกับทุกสิ่งที่คุณต้องการออกไป

หากสิ่งที่คุณกำลังทำคือการใส่ข้อมูลลงในไฟล์แสดงว่าไม่ได้ใช้ไพพ์ หากไฟล์เป็นไฟล์ Fifo ไม่ใช่ไฟล์ปกติแสดงว่าเป็นเพียงการนัดพบที่มีชื่อและไม่มีข้อมูล ใช้ ls -l เพื่อค้นหา

และโปรดทราบว่าหากคุณหวังที่จะหยุดไม่ให้ผู้ใช้เห็นสิ่งที่กำลังดำเนินไปป์ในกระบวนการที่พวกเขาเป็นเจ้าของคุณก็ค่อนข้างจะเก่งเพราะstraceสามารถตรวจสอบทุกอย่างที่กระบวนการทำนั้นโต้ตอบกับสิ่งใดนอกกระบวนการยกเว้นการอ่าน / เขียน หน่วยความจำ ltraceยิ่งรุกราน หากโปรแกรมของคุณทำงานบนระบบที่ผู้ใช้โลคัลมีรูทคุณจะไม่สามารถหยุดพวกเขาได้เลย บน Unix รูทสามารถทำอะไรก็ได้และมีเครื่องมือที่ทรงพลังเพื่อจุดประสงค์


1

ไพพ์ที่แท้จริงคือบล็อกหน่วยความจำในเคอร์เนลบัฟเฟอร์ที่ถูกอ่าน / เขียนโดยกระบวนการบางอย่าง มันไม่ได้สร้างไฟล์ได้ทุกที่

แอพบางตัวมีตัวเลือกที่สลับระหว่างการใช้ไพพ์ (เร็วกว่าไม่ต้องกดดิสก์ใช้หน่วยความจำเพิ่มอีกเล็กน้อย) และการใช้ไฟล์ temp (ใช้หน่วยความจำน้อยลงช่วยให้คุณสามารถดูไฟล์เทมเพลตได้ช้าลง) gccเป็นหนึ่งในแอปพลิเคชันดังกล่าวแม้ว่าอาจเป็นแอปพลิเคชันอื่น ๆ


0

แฮ็คสกปรก: เข้ารหัสข้อมูลก่อนส่งและถอดรหัสเมื่อได้รับหากคุณสามารถเปลี่ยนกระบวนการทั้งสอง ...


จะไม่เรียกมันว่าแฮ็คที่สกปรกจริง ๆ แล้ว: หากข้อมูลมีความละเอียดอ่อนดูเหมือนจะเป็นทางออกที่เหมาะสม แต่ฉันอยากรู้เกี่ยวกับไฟล์ tmp OP นั้นถูกต้องหรือไม่ที่เคอร์เนลกำลังสร้างอยู่? หรือจะเป็นนีลที่ถูกต้องและมันเป็นปลายด้านหนึ่งของท่อหรืออื่น ๆ ...

เคอร์เนลไม่ได้สร้างไฟล์ชั่วคราว ในทางตรงกันข้ามเป็นไปได้มากที่กระบวนการรับกำลังสร้างไฟล์ชั่วคราว นี่เป็นเรื่องธรรมดาเนื่องจากถ้าคุณต้องการค้นหาสิ่งที่คุณป้อนคุณต้องเขียนมันลงในไฟล์ก่อน
larsks
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.