linux Os ปล่อยให้แอปพลิเคชันอ่านจากไปป์อย่างไร

ฉันสับสนว่า linux ปล่อยให้แอปพลิเคชันอ่านจากไพพ์เช่น "cat /etc/hosts | grep 'localhost'" ได้อย่างไร ฉันรู้ว่าในโปรแกรมอิสระแยกเด็กและสื่อสารผ่านท่อระหว่างกัน แต่สำหรับสองโปรแกรมอิสระที่สื่อสารด้วยไปป์ฉันไม่รู้ว่าต้องทำอย่างไร ในตัวอย่าง "cat /etc/hosts | grep 'localhost'" Grep จะรู้ได้อย่างไรว่าควรอ่านตัวอธิบายไฟล์ใดเพื่อรับอินพุตจาก "cat /etc/hosts" มีไพพ์ "ทั่วไป" ที่ OS จัดทำขึ้นเพื่อให้ Grep ทราบว่าจะรับอินพุตได้ที่ไหน ฉันต้องการทราบกลไกเบื้องหลังสิ่งนี้


person terry    schedule 15.11.2010    source แหล่งที่มา


คำตอบ (1)


grep ในตัวอย่างของคุณรับจาก stdin เป็นความรับผิดชอบของเชลล์ในการเรียก pipe(2) เพื่อสร้างไพพ์ จากนั้น dup2(2) ใน fork(2) ลูกๆ แต่ละตัวเพื่อกำหนดจุดสิ้นสุดของไพพ์ให้กับ stdin หรือ stdout ก่อนที่จะเรียกใช้ฟังก์ชัน exec(3) ฟังก์ชันใดฟังก์ชันหนึ่งเพื่อเรียกใช้โปรแกรมเรียกทำงานอื่นๆ จริงๆ

person Ignacio Vazquez-Abrams    schedule 15.11.2010
comment
จุดสำคัญที่นี่คือในตัวอย่างที่ให้มา ทั้ง cat และ grep เป็นกระบวนการย่อยของเชลล์ ดังนั้นทั้งสอง จึง เกี่ยวข้องกัน - person caf; 16.11.2010
comment
มันคือ pipe(2) ไม่ใช่ mkfifo(3) เนื่องจากไปป์ไม่มีชื่อ - person Roman Cheplyaka; 19.11.2010