อายุขัยของไฟล์ descriptor คืออะไร?


11

ตามที่อธิบายไว้ที่นี่การเปลี่ยนเส้นทางใช้open()เพื่อเขียนไฟล์ มีตัวอธิบายไฟล์ Inner (?) ที่สร้างขึ้นในเชลล์แล้วใช้เมื่อจำเป็น

descriptor ด้านในถูกสร้างขึ้นตลอดระยะเวลาของสคริปต์หรืออายุการใช้งานเชลล์หรือไม่? มันจะถูกทำลายหลังจากเวลาผ่านไปหลายครั้งหรือหลายครั้งหรือไม่?

ฉันหมายถึงโดยเฉพาะอย่างยิ่ง file descriptor สำหรับไฟล์ที่เชลล์ตัวเองเปิดขึ้นสำหรับการทำงานของ builtins สร้าง descriptor และเปิดไฟล์สำหรับการดำเนินการแต่ละครั้งหรือไม่ พวกเขาจะเก็บไว้นานแค่ไหน? ตัวอย่าง:

#!/bin/bash
>>x echo something
...do many other things not related to the file x
>>x echo something more

อินสแตนซ์ของ descriptor แรกถูกเก็บไว้จนกว่าการดำเนินการที่สองหรือไม่

แล้วเชลล์ที่ฉันใช้ในเทอร์มินัลล่ะ บางครั้งฉันเปิดเซสชันหนึ่งวันอาจเป็นสัปดาห์ มันยังคงรักษาคำอธิบายสำหรับไฟล์ทั้งหมดที่ฉันดำเนินการกับเชลล์ในตัว?

คำตอบ:


4

สั้น ๆ :เชลล์จะปิดตัวอธิบายไฟล์ที่เกี่ยวข้องกับการเปลี่ยนเส้นทางทันทีหลังจากคำสั่งเสร็จสิ้น


รายละเอียด:ไม่มีการกล่าวถึงการปิดไฟล์ที่เปิดผ่านการเปลี่ยนเส้นทางอย่างชัดเจนใน POSIX (เท่าที่ฉันเห็น) แต่ไม่ปิดพวกเขาทันทีจะไม่มีประโยชน์มาก

กฎสำหรับสภาพแวดล้อมที่คำสั่งใด ๆ ที่จะเริ่มต้นในการไม่อนุญาตให้ผ่านอธิบายไฟล์พิเศษ เชลล์จะต้องระมัดระวังในการปิด fd พิเศษใด ๆ ที่มันถูกบันทึกไว้เมื่อเริ่มต้นคำสั่งที่ไม่ควรมี

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

ตัวอย่างเช่นสิ่งนี้จะไม่ทำงานอย่างถูกต้องหาก fd ที่เปิดสำหรับครั้งแรกechoถูกเปิดไว้และใช้ตามที่เป็นอยู่สำหรับที่สอง:

echo foo >> x; mv x y; echo bar >> x

รูปแบบ fork + exec ปกติที่ใช้สำหรับการเริ่มโปรแกรมภายนอกทำให้มันง่ายมากที่จะให้ไฟล์ปิดโดยอัตโนมัติเมื่อคำสั่งออกจาก เชลล์จะต้องดำเนินการfork()ก่อนเท่านั้นและเปิดไฟล์ที่จำเป็นใด ๆ ในกระบวนการ child ก่อนที่จะโทรexec()เพื่อแทนที่ child ด้วยคำสั่งจริง เมื่อกระบวนการลูกออกจากไฟล์ใด ๆ ที่เปิดโดยมันจะถูกปิดโดยอัตโนมัติ


ในawkแม้ว่าไวยากรณ์สำหรับการเปลี่ยนเส้นทางเอาต์พุตจะคล้ายกับเชลล์ แต่ไฟล์ที่เปิดใด ๆ จะยังคงเปิดอยู่จนกว่าสคริปต์จะออกจนกว่าจะปิดอย่างชัดเจน สิ่งนี้จะเปิดเพียงfooครั้งเดียวเท่านั้นและจะไม่ตัดทอนลงในระหว่างการพิมพ์:

awk 'BEGIN { print "a" > "foo"; print "b" > "foo" }'

6

พวกเขาจะปิดเมื่อเสร็จสิ้นด้วย เชลล์จะสร้างไฟล์ descriptors 3 ไฟล์เป็น 0,1,2 สำหรับแต่ละคำสั่งที่รัน เหล่านี้เป็นเพียงตัวเลขตัวเลขจะถูกนำมาใช้ซ้ำ เชลล์จะปิดไฟล์ก่อนที่จะใช้ descriptors อีกครั้ง

ตัวอธิบายไฟล์จะถูกส่งไปยังกระบวนการอื่นเช่นกัน และถ้าคุณมีกระบวนการในเบื้องหลังมันจะยังคงมีตัวอธิบายไฟล์

ตัวอย่างการใช้งาน3>&1ซึ่งหมายถึงทำให้ file descriptor 3 อ้างถึงไฟล์ที่ descriptor 1 อ้างถึงในปัจจุบัน

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