ฉันสับสนว่า linux ปล่อยให้แอปพลิเคชันอ่านจากไพพ์เช่น "cat /etc/hosts | grep 'localhost'" ได้อย่างไร ฉันรู้ว่าในโปรแกรมอิสระแยกเด็กและสื่อสารผ่านท่อระหว่างกัน แต่สำหรับสองโปรแกรมอิสระที่สื่อสารด้วยไปป์ฉันไม่รู้ว่าต้องทำอย่างไร ในตัวอย่าง "cat /etc/hosts | grep 'localhost'" Grep จะรู้ได้อย่างไรว่าควรอ่านตัวอธิบายไฟล์ใดเพื่อรับอินพุตจาก "cat /etc/hosts" มีไพพ์ "ทั่วไป" ที่ OS จัดทำขึ้นเพื่อให้ Grep ทราบว่าจะรับอินพุตได้ที่ไหน ฉันต้องการทราบกลไกเบื้องหลังสิ่งนี้
linux Os ปล่อยให้แอปพลิเคชันอ่านจากไปป์อย่างไร
คำตอบ (1)
grep ในตัวอย่างของคุณรับจาก stdin เป็นความรับผิดชอบของเชลล์ในการเรียก pipe(2)
เพื่อสร้างไพพ์ จากนั้น dup2(2)
ใน fork(2)
ลูกๆ แต่ละตัวเพื่อกำหนดจุดสิ้นสุดของไพพ์ให้กับ stdin หรือ stdout ก่อนที่จะเรียกใช้ฟังก์ชัน exec(3)
ฟังก์ชันใดฟังก์ชันหนึ่งเพื่อเรียกใช้โปรแกรมเรียกทำงานอื่นๆ จริงๆ
person
Ignacio Vazquez-Abrams
schedule
15.11.2010
จุดสำคัญที่นี่คือในตัวอย่างที่ให้มา ทั้ง
cat
และ grep
เป็นกระบวนการย่อยของเชลล์ ดังนั้นทั้งสอง จึง เกี่ยวข้องกัน
- person caf; 16.11.2010
มันคือ
pipe(2)
ไม่ใช่ mkfifo(3)
เนื่องจากไปป์ไม่มีชื่อ
- person Roman Cheplyaka; 19.11.2010