คำถามติดแท็ก file-descriptors

3
ค้นหาคำอธิบายไฟล์ที่แชร์ "open file description"
ถ้าฉันทำ (ในเชลล์เหมือนบอร์น): exec 3> file 4>&3 5> file 6>> file ตัวอธิบายไฟล์ 3 และ 4 ตั้งแต่ 4 เป็นdup()ed จาก 3 แชร์คำอธิบายไฟล์แบบเปิดเดียวกัน (คุณสมบัติเดียวกันชดเชยแบบเดียวกันภายในไฟล์ ... ) ในขณะที่ตัวอธิบายไฟล์ 5 และ 6 ของกระบวนการนั้นอยู่ในคำอธิบายไฟล์แบบเปิดที่แตกต่างกัน(ตัวอย่างเช่นแต่ละไฟล์มีตัวชี้ในไฟล์) ขณะนี้ในlsofการส่งออกทั้งหมดที่เราเห็นคือ: zsh 21519 stephane 3w REG 254,2 0 10505865 /home/stephane/file zsh 21519 stephane 4w REG 254,2 0 10505865 /home/stephane/file zsh 21519 stephane …

3
การใช้งานในทางปฏิบัติสำหรับการย้ายไฟล์อธิบาย
ตามหน้าคนทุบตี: ผู้ประกอบการเปลี่ยนเส้นทาง [n]<&digit- ย้าย file descriptor digitไปที่ file descriptor nหรืออินพุตมาตรฐาน (file descriptor 0) หากnไม่ได้ระบุไว้ digitถูกปิดหลังจากการพิมพ์nซ้ำ การย้าย "file descriptor" ไปยังอีกอันหนึ่งหมายความว่าอะไร? สถานการณ์ทั่วไปสำหรับการฝึกเช่นนี้มีอะไรบ้าง

2
จะเกิดอะไรขึ้นเมื่อฉันปิด () file descriptor?
ฉันพยายามดึงภาพทั้งหมดด้วยตัวอธิบายไฟล์ ว่าฉันมี process1 ซึ่งเริ่มมีไฟล์อธิบายเหล่านี้: _process1_ | | | 0 stdin | | 1 stdout | | 2 stderr | |__________| จากนั้นฉันปิดไฟล์ descriptor 1: close(1); แฟ้มบ่ง 1 แปล (คะแนน) ที่ stdout โครงสร้างไฟล์ในเคอร์เนลที่เปิดไฟล์ตาราง ด้วยรหัสด้านบนตัวอธิบายไฟล์ 1 จะถูกลบออกจากตารางกระบวนการซึ่งกลายเป็น: _process1_ | | | 0 stdin | | 2 stderr | |__________| แต่จะเกิดอะไรขึ้นในเคอร์เนล? ที่ไม่stdoutโครงสร้างแฟ้มได้รับ deallocated? เป็นไปได้อย่างไรถ้า …

3
ทำไม fork () ได้รับการออกแบบมาเพื่อคืน file descriptor?
เมื่อเขาหน้าเว็บเกี่ยวกับเคล็ดลับท่อตนเองแดน Bernstein อธิบายสภาพการแข่งขันด้วยselect()และสัญญาณข้อเสนอการแก้ปัญหาและสรุปว่า แน่นอนว่าสิ่งที่ถูกต้องคือการfork()ส่งคืนไฟล์อธิบายไม่ใช่รหัสกระบวนการ เขาหมายความว่าอย่างไร - เป็นเรื่องเกี่ยวกับความสามารถselect()ในกระบวนการลูกเพื่อจัดการการเปลี่ยนแปลงสถานะของพวกเขาแทนที่จะต้องใช้เครื่องจัดการสัญญาณเพื่อรับการแจ้งเตือนการเปลี่ยนแปลงสถานะเหล่านั้นหรือไม่

2
อธิบายไฟล์และทางแยก
เมื่อเด็กถูกแยกแล้วมันจะสืบทอดตัวบ่งชี้ไฟล์ของผู้ปกครองถ้าเด็กปิดตัวอธิบายไฟล์จะเกิดอะไรขึ้น? หากเด็กเริ่มเขียนสิ่งที่จะเกิดขึ้นกับไฟล์ที่ส่วนท้ายของผู้ปกครอง? ใครเป็นผู้จัดการความไม่สอดคล้องกันเคอร์เนลหรือผู้ใช้เหล่านี้ เมื่อกระบวนการเรียกใช้closeฟังก์ชันเพื่อปิดไฟล์ที่เปิดเฉพาะผ่าน file descriptor ในตารางไฟล์ของกระบวนการจำนวนการอ้างอิงจะลดลงหนึ่งรายการ แต่เนื่องจากพาเรนต์และชายด์กำลังถือไฟล์เดียวกันการนับการอ้างอิงคือ 2 และหลังจากปิดจึงลดลงเหลือ 1 เนื่องจากกระบวนการไม่เป็นศูนย์กระบวนการยังคงใช้ไฟล์ต่อโดยไม่มีปัญหาใด ๆ ดูที่การเขียนโปรแกรมระบบ UNIX ของ Terrence Chan (รองรับเคอร์เนล Unix สำหรับไฟล์)

1
exec 3 <& 1 ทำอะไร
ฉันเข้าใจว่าexecสามารถเปลี่ยนเส้นทาง I / O บนเชลล์ปัจจุบันได้ แต่ฉันเห็นการใช้งานเช่น: exec 6&lt;&amp;0 # Link file descriptor #6 with stdin. # Saves stdin. exec 6&gt;&amp;1 # Link file descriptor #6 with stdout. # Saves stdout. จากที่ฉันเข้าใจว่า&lt;มีไว้สำหรับอินพุตสตรีม&gt;สำหรับสตรีมเอาต์พุต แล้วจะexec 3&lt;&amp;1ทำอย่างไรดี? PS: ฉันพบสิ่งนี้จากซอร์สโค้ดของ Bats

2
ทำไม SSH ไม่รอกระบวนการพื้นหลัง
ทำไมมันssh -tไม่รอให้งานพื้นหลังเสร็จ? ตัวอย่าง: ssh user@example 'sleep 2 &amp;' ใช้งานได้ตามที่คาดไว้เนื่องจาก ssh กลับมาหลังจาก 2 วินาทีในขณะที่ ssh user@example -t 'sleep 2 &amp;' ไม่รอsleepให้เสร็จและส่งคืนทันที ทุกคนสามารถอธิบายเหตุผลที่อยู่เบื้องหลังสิ่งนี้ได้ไหม มีวิธีssh -tรอกระบวนการพื้นหลังทั้งหมดให้เสร็จก่อนที่จะส่งคืนหรือไม่ กรณีการใช้งานของฉันคือฉันเริ่มต้นสคริปต์ด้วยssh -tและสคริปต์นี้เริ่มงานพื้นหลังต่าง ๆ ที่ควรมีชีวิตอยู่หลังจากสคริปต์หลักเสร็จสิ้น ด้วยssh -tสิ่งนี้เป็นไปไม่ได้จนถึงตอนนี้

2
จะหาความเร็วของอินเตอร์เฟส wlan ได้อย่างไร
ฉันพยายามค้นหาความเร็วของอินเทอร์เฟซเครือข่ายโดยใช้ file-descriptor มันเป็นเรื่องง่ายที่จะทำเพื่อเพียงโทรethX cat /sys/class/net/eth0/speedน่าเสียดายที่วิธีนี้ใช้ไม่ได้กับอินเทอร์เฟซไร้สาย เมื่อฉันโทรหา/sys/class/net/wlan0/speedฉันพบข้อผิดพลาด: อาร์กิวเมนต์ไม่ถูกต้อง คุณรู้หรือไม่/sys/class/net/eth0/speedว่าอะนาล็อกสำหรับอินเตอร์เฟส wlan?


1
แก้ไข ulimit: เปิดไฟล์: ไม่สามารถแก้ไขข้อ จำกัด : ไม่อนุญาตให้ใช้งาน
ฉันทดสอบสิ่งนี้ในการติดตั้ง GNU / Linux อื่น: perl -e 'while(1){open($a{$b++}, "&lt;" ,"/dev/null") or die $b;print " $b"}' ระบบ A และ D ขีด จำกัด แรกที่ฉันตีคือ 1024 มันสามารถยกได้ง่ายโดยใส่สิ่งนี้ลงใน /etc/security/limits.conf: * hard nofile 1048576 จากนั้นเรียกใช้: ulimit -n 1048576 echo 99999999 | sudo tee /proc/sys/fs/file-max ตอนนี้การทดสอบไปที่ 1048576 อย่างไรก็ตามดูเหมือนว่าฉันไม่สามารถยกระดับได้เหนือ 1048576 ถ้าฉันใส่ 1048577 ใน limit.conf มันก็จะถูกละเว้น อะไรทำให้เกิดสิ่งนั้น ระบบ …

3
SSH: ระบุ "ท่อ" fds เพิ่มเติมนอกเหนือจาก stdin, stdout, stderr
เมื่อเชื่อมต่อไปยังโฮสต์กับ SSH มักจะสาม "ท่อ" ที่มีให้ระหว่างเจ้าภาพและแขกสำหรับstdin, และstdoutstderr มีตัวเลือกบรรทัดคำสั่งเพื่อส่งต่อสำหรับตัวอธิบายไฟล์เพิ่มเติม ( 3เป็นต้นไป) หรือไม่? ตัวอย่างเช่นฉันต้องการทำ ssh --forwardfd=10:3 remotehost 'echo test &gt;&amp;3' ซึ่งจะพิมพ์ 'ทดสอบ' ไปยังตัวอธิบายไฟล์ที่เปิดในเครื่อง 10

7
ทดสอบว่า file descriptor ถูกต้องหรือไม่
ฉันต้องการสร้างสคริปต์ทุบตีข้อมูลเพิ่มเติมให้กับ file descriptors (FDs) มากกว่าหรือเท่ากับ 3 เมื่อเปิด เพื่อทดสอบว่า FD เปิดอยู่หรือไม่ฉันได้วางแผนเคล็ดลับต่อไปนี้: if (printf '' 1&gt;&amp;3) 2&gt;&amp;-; then # File descriptor 3 is open else # File descriptor 3 is not open fi นี่เพียงพอสำหรับความต้องการของฉัน แต่ฉันอยากรู้ว่ามีวิธีการทดสอบที่เป็นไปตามสำนวนมากขึ้นหรือไม่ถ้า FD นั้นถูกต้อง ฉันสนใจเป็นพิเศษเกี่ยวกับว่ามีการแม็พfcntl(1)syscall กับคำสั่งเชลล์หรือไม่ซึ่งจะอนุญาตให้เรียกใช้แฟล็ก FD ( O_WRONLYและ O_RDWRเพื่อทดสอบว่า FD สามารถเขียนได้หรือไม่O_RDONLYและ O_RDWRเพื่อทดสอบว่า FD อ่านได้หรือไม่)

2
file descriptor กับชื่อไฟล์
ฉันสงสัยว่าความแตกต่างและความสัมพันธ์ระหว่างตัวอธิบายไฟล์และชื่อไฟล์คืออะไร พวกเขาทั้งหมดคุ้นเคยกับการเข้าถึงไฟล์หรือไม่? ถ้าใช่ด้วยวิธีเดียวกัน ตัวอย่างเช่น/dev/fd/0, /dev/stdinและมีการเชื่อมโยงทั้งหมดเพื่อ/proc/self/fd/0 /dev/pts/2คำอธิบายไฟล์สี่ไฟล์นี้หรือชื่อไฟล์?

3
โปรแกรมบันทึกสามารถเข้าสู่ไฟล์ที่ถูกลบได้อย่างไร?
จากเครื่องมือไฟฟ้าของ Unix รุ่นที่ 3 : แทนที่จะลบไฟล์ให้ล้างข้อมูลในส่วน: หากกระบวนการที่แอ็คทีฟเปิดไฟล์ (ไม่ใช่เรื่องแปลกสำหรับล็อกไฟล์) การลบไฟล์และการสร้างใหม่จะไม่ส่งผลกระทบต่อโปรแกรมบันทึก ข้อความเหล่านั้นก็จะเก็บไปยังแฟ้มที่ไม่ได้เชื่อมโยง การล้างไฟล์ไม่ทำให้การเชื่อมโยงเสียหายดังนั้นจึงเป็นการล้างไฟล์โดยไม่มีผลกับโปรแกรมการบันทึก ( เน้นที่เหมือง ) ฉันไม่เข้าใจว่าทำไมโปรแกรมจะเข้าสู่ไฟล์ที่ถูกลบต่อไป เป็นเพราะรายการตัวให้คำอธิบายไฟล์ไม่ถูกลบออกจากตารางกระบวนการ?

2
อายุขัยของไฟล์ descriptor คืออะไร?
ตามที่อธิบายไว้ที่นี่การเปลี่ยนเส้นทางใช้open()เพื่อเขียนไฟล์ มีตัวอธิบายไฟล์ Inner (?) ที่สร้างขึ้นในเชลล์แล้วใช้เมื่อจำเป็น descriptor ด้านในถูกสร้างขึ้นตลอดระยะเวลาของสคริปต์หรืออายุการใช้งานเชลล์หรือไม่? มันจะถูกทำลายหลังจากเวลาผ่านไปหลายครั้งหรือหลายครั้งหรือไม่? ฉันหมายถึงโดยเฉพาะอย่างยิ่ง file descriptor สำหรับไฟล์ที่เชลล์ตัวเองเปิดขึ้นสำหรับการทำงานของ builtins สร้าง descriptor และเปิดไฟล์สำหรับการดำเนินการแต่ละครั้งหรือไม่ พวกเขาจะเก็บไว้นานแค่ไหน? ตัวอย่าง: #!/bin/bash &gt;&gt;x echo something ...do many other things not related to the file x &gt;&gt;x echo something more อินสแตนซ์ของ descriptor แรกถูกเก็บไว้จนกว่าการดำเนินการที่สองหรือไม่ แล้วเชลล์ที่ฉันใช้ในเทอร์มินัลล่ะ บางครั้งฉันเปิดเซสชันหนึ่งวันอาจเป็นสัปดาห์ มันยังคงรักษาคำอธิบายสำหรับไฟล์ทั้งหมดที่ฉันดำเนินการกับเชลล์ในตัว?

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