ข้อดีของการใช้ไปป์ที่มีชื่อบนไพพ์ที่ไม่มีชื่อคืออะไร


51

ฉันทบทวนคำถามสัมภาษณ์ที่ถามจากผู้ดูแลระบบยูนิกซ์; ฉันพบหัวข้อที่ชื่อว่า "named pipe"

ฉันไปที่หัวข้อ เท่าที่ฉันสามารถเข้าใจได้: - ชื่อท่อ | | FIFO

แต่ถึงกระนั้นฉันก็รู้สึกว่าฉันขาดความรู้ว่าจะใช้ท่อชนิดนี้เมื่อใด มีสถานการณ์พิเศษใด ๆ ที่ท่อที่ไม่มีชื่อจะไม่ทำงานหรือไม่


ลิงก์อื่นในฟอรัมทางเทคนิค: writeulearn.com/category/inter-process-communicationipc

คำตอบ:


39

ชื่อ pipes (FIFO) มีสี่สามข้อได้เปรียบที่ฉันสามารถคิด:

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

    *) คิดว่าเปลือกมาตรฐาน|ท่อซึ่งเป็นทิศทางเดียว, หอยหลายคน ( ksh, zshและbash) นอกจากนี้ยังมีcoprocessesซึ่งจะช่วยให้การสื่อสารแบบสองทิศทาง POSIX ถือว่าไพพ์เป็นแบบฮาล์ฟดูเพล็กซ์ (นั่นคือแต่ละด้านสามารถอ่านหรือเขียนได้เท่านั้น) การpipe()เรียกของระบบจะส่งคืนการจัดการไฟล์สองไฟล์และคุณอาจจำเป็นต้องใช้แบบอ่านอย่างเดียว ระบบ (BSD) บางระบบรองรับการอ่านและเขียนพร้อมกัน (ไม่ได้รับอนุญาตจาก POSIX) ในระบบอื่นคุณจะต้องใช้สองท่อสำหรับแต่ละทิศทาง ตรวจสอบของคุณpipe(), popen()และอาจจะเป็นpopen2()หน้าคน undirectionality อาจไม่ได้ขึ้นอยู่กับว่าไปป์นั้นมีชื่อหรือไม่แม้ว่าใน Linux 2.6 จะขึ้นอยู่กับ

(อัปเดตขอบคุณคำติชมจากStephane Chazelas )

ดังนั้นหนึ่งในภารกิจที่ชัดเจนในทันทีที่คุณไม่สามารถทำได้ด้วยไพพ์ที่ไม่มีชื่อคือแอปพลิเคชันไคลเอนต์ / เซิร์ฟเวอร์ทั่วไป

สุดท้าย (กลัว) ชี้ข้างต้นเกี่ยวกับท่อทิศทางเดียวมีความเกี่ยวข้องบน Linux POSIX (ดูpopen()) กล่าวว่าท่อเท่านั้นจำเป็นต้องอ่านหรือเขียนได้บนลินุกซ์ที่พวกเขามีทิศทางเดียว ดูที่การทำความเข้าใจกับเคอร์เนล Linux (3rd O'Reilly) สำหรับรายละเอียดเฉพาะของ Linux (p787) ข้อเสนอแบบสองทิศทางของท่ออื่น ๆ (ไม่มีชื่อ) ของระบบปฏิบัติการ

ตัวอย่างเช่น Nagios ใช้แบบ FIFO สำหรับไฟล์คำสั่ง กระบวนการภายนอกต่างๆ (สคริปต์ CGI, การตรวจสอบภายนอก, NRPE ฯลฯ ) เขียนคำสั่ง / อัปเดตไปยังฟีเจอร์นี้และประมวลผลโดยกระบวนการ Nagios แบบถาวร

ไปป์ที่มีชื่อมีคุณลักษณะที่ไม่เหมือนกับการเชื่อมต่อ TCP แต่มีความแตกต่างที่สำคัญ เนื่องจาก Fifo มีชื่อระบบไฟล์ถาวรคุณสามารถเขียนได้แม้ว่าจะไม่มีผู้อ่านการยอมรับการเขียนจะบล็อก (โดยไม่มี async หรือ non-blocking I / O) แม้ว่าคุณจะไม่หลวมข้อมูลหากผู้รับไม่ได้ เริ่มต้นแล้ว (หรือกำลังเริ่มต้นใหม่)

สำหรับการอ้างอิงโปรดดูที่ซ็อกเก็ตโดเมน Unixและคำตอบสำหรับคำถาม Stackoverflowซึ่งสรุปวิธีการIPCหลักและอันนี้พูดถึงpopen()


2
คุณสามารถมีผู้อ่าน / นักเขียนหลายคนพร้อมท่อที่ไม่มีชื่อเช่นกัน บน Linux ไม่ได้เป็นแบบสองทิศทางมากกว่าไปป์ที่ไม่มีชื่อ มีจุดสิ้นสุดการเขียนและจุดสิ้นสุดการอ่านและการไหลของข้อมูลในทิศทางเดียวเท่านั้น เมื่อคุณเปิด Fifo ในโหมดการเขียนคุณจะได้รับการเขียนในโหมดการอ่านส่วนท้ายของการอ่านในโหมด rw คุณจะเขียนไปยังส่วนการเขียนและอ่านจากการอ่าน ซึ่งแตกต่างจากไปป์สองทิศทางหรือซ็อกเก็ตโดเมน unix ที่คุณมีการไหลของข้อมูลแยกกันในแต่ละทิศทาง
Stéphane Chazelas

@ StephanChazelas ขอบคุณสำหรับคำติชมฉันได้อัปเดตคำตอบให้เฉพาะเจาะจงมากขึ้นและชี้แจงไปถึง (ฉันหวัง) ท่อและทิศทาง
mr.spuratic

การสื่อสารกับไพพ์ที่มีชื่อเกี่ยวข้องกับดิสก์ IO หรือไม่? หรือมันคือทั้งหมดในหน่วยความจำ? อะไรเป็นตัวกำหนดประสิทธิภาพของกลไก IPC เหล่านี้
CMCDragonkai

15

ไปป์ที่ไม่ระบุชื่อหรือไม่ระบุชื่อให้วิธีการสื่อสารแบบหนึ่งต่อหนึ่ง, การประมวลผลทางเดียวระหว่างกระบวนการที่แตกต่างกันที่เกี่ยวข้องโดยความสัมพันธ์พ่อแม่และลูกหรือเป็นลูกของผู้ปกครองทั่วไปที่มีท่อเช่นเปลือก กระบวนการ. เนื่องจากกระบวนการเกี่ยวข้องกันความสัมพันธ์ของ file descriptors กับไพพ์อาจเป็นนัยและไม่ต้องการวัตถุที่มีชื่อที่อยู่ภายนอกกระบวนการ ไพพ์ที่ไม่มีชื่อนั้นจะมีอยู่ตราบเท่าที่โพรเซสที่ใช้รักษาโพรไฟล์ที่เปิดอยู่ของไพพ์ เมื่อกระบวนการหยุดทำงานและ OS ปิดตัวอธิบายไฟล์ทั้งหมดที่เกี่ยวข้องกับกระบวนการไพพ์ที่ไม่มีชื่อจะถูกปิด

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

ดังนั้นคำตอบสั้น ๆ คือคุณต้องใช้ไพพ์ที่มีชื่อสำหรับการสื่อสารระหว่างกระบวนการที่ไม่เกี่ยวข้องซึ่งอาจไม่มีอยู่ในเวลาเดียวกัน


+1 ฉันคิดว่ากระบวนการต่าง ๆ นั้นมีอยู่เสมอในเวลาเดียวกัน (ไม่อย่างนั้นไพพ์นั้นไร้จุดหมายเล็กน้อย - คุณก็อาจทิ้งของไว้ในไฟล์ปกติ) ซ็อกเก็ตโดเมนและ unix เหล่านี้มักจะใช้โดยบริการ daemon ที่สามารถควบคุมได้เช่นจากบรรทัดคำสั่ง หากคุณดูใน/runระบบเดสก์ท็อปของ linux คุณอาจพบว่ามีทั้งสองอย่าง (ชื่อ fifos และซ็อกเก็ตยูนิกซ์) มันเป็นรูปแบบของIPC
goldilocks

2
@goldilocks: ไปป์ที่มีชื่อมักใช้เป็นกล่องจดหมายแบบ ad-hoc หน่วยความจำระหว่างกระบวนการในระบบฝังตัวโดยที่กระบวนการสื่อสารนั้นมีอายุสั้นและไม่มีอยู่ในเวลาเดียวกัน ข้อได้เปรียบคือความเรียบง่ายของการติดตั้งเมื่อเทียบกับหน่วยความจำที่ใช้ร่วมกัน IPC และความจริงที่ว่ามีการใช้ RAM เท่านั้น ข้อเสียคือการไม่คงอยู่ระหว่างการบูทกับธรรมชาติของ FIFO แบบ byte-wise ของไปป์เทียบกับความสามารถในการใช้โครงสร้างที่มีหน่วยความจำที่ใช้ร่วมกัน
Jonathan Ben-Avraham

@ โจนาธาน: +1 ฉันมีข้อสงสัย: - ทำไมเราถึงเรียกชื่อไพพ์เป็น FIFO; วัตถุทนอยู่คืออะไร?
Ankit

@Ankit: บางคนเรียกชื่อไปป์ว่า FIFO เพราะมันทำงานเหมือนโครงสร้างข้อมูล FIFO โดยเฉพาะอย่างยิ่งเมื่อเปิดทั้งการอ่านและการเขียนโดยกระบวนการเดียว โดย "วัตถุถาวร" ฉันหมายถึงไพพ์ที่มีชื่อนั้นเชื่อมโยงกับวัตถุระบบไฟล์ นั่นคือมันเป็นไฟล์ประเภทหนึ่งที่มีชื่อและมีความคงอยู่เช่นเดียวกับไฟล์อื่น ๆ ที่เก็บไว้ในสื่อ
Jonathan Ben-Avraham

4

ข้อดีอย่างหนึ่งที่ไม่ได้กล่าวถึงในที่อื่นคือสามารถใช้ไพพ์ที่มีชื่อในสถานที่ที่จะใช้ไฟล์เท่านั้น

ตัวอย่างเช่นไคลเอนต์อีเมลบางรายมีคุณสมบัติต่อท้ายเนื้อหาของ ~ / .signature ไปกับข้อความอีเมลทุกข้อความ หาก. signature เป็นตัวเลือกบรรทัดคำสั่งหรือหากไคลเอ็นต์อีเมลสามารถสังเกตเห็นได้ว่า. signature นั้นสามารถเรียกใช้งานได้และรันได้คุณจะไม่ต้องใช้ไพพ์ที่มีชื่อ แต่ถ้าเมลไคลเอ็นต์นั้นไม่ซับซ้อนคุณสามารถสร้างไพพ์ที่มีชื่อว่าชื่อว่า. signi และเรียกใช้แอปพลิเคชั่นที่สร้างลายเซ็นใหม่ทุกครั้งที่อ่านไฟล์


น่าสนใจ คุณมีแอปพลิเคชั่นดังกล่าวหรือไม่? ดูเหมือนว่าจะต้องดูที่ระดับเคอร์เนลเพื่อดูว่าเมื่อใดที่มีการเข้าถึง FIFO
Wildcard

4

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

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