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


7
คุณจะใช้ตัวอธิบายไฟล์เพิ่มเติมเมื่อใด
ฉันรู้ว่าคุณสามารถสร้างไฟล์ descriptor และเปลี่ยนเส้นทางไปยังมัน เช่น exec 3<> /tmp/foo # open fd 3. echo a >&3 # write to it exec 3>&- # close fd 3. แต่คุณสามารถทำสิ่งเดียวกันโดยไม่มีไฟล์ descriptor: FILE=/tmp/foo echo a > "$FILE" ฉันกำลังมองหาตัวอย่างที่ดีเมื่อคุณจะต้องใช้ตัวอธิบายไฟล์เพิ่มเติม

2
> & - มีประสิทธิภาพมากกว่า> / dev / null หรือไม่
เมื่อวานนี้ผมอ่านนี้เพื่อแสดงความคิดเห็นที่บอกว่าในเปลือก (อย่างน้อยbash) "มีผลเช่นเดียวกับ">&->/dev/null ความคิดเห็นนั้นหมายถึงคู่มือ ABSเป็นแหล่งข้อมูล แต่แหล่งที่มาบอกว่า>&-ไวยากรณ์ "ปิด file descriptors" ไม่ชัดเจนสำหรับฉันว่าการกระทำสองอย่างของการปิดไฟล์ descriptor และการเปลี่ยนเส้นทางไปยังอุปกรณ์ null นั้นมีความเทียบเท่าโดยสิ้นเชิง ดังนั้นคำถามของฉันคือพวกเขา? บนพื้นผิวของมันดูเหมือนว่าการปิด descriptor เป็นเหมือนการปิดประตู แต่การเปลี่ยนเส้นทางไปยังอุปกรณ์ null กำลังเปิดประตูสู่บริเวณขอบรก! ทั้งสองดูเหมือนจะไม่เหมือนกันกับฉันเพราะถ้าฉันเห็นประตูที่ปิดฉันจะไม่พยายามโยนอะไรออกไปจากมัน แต่ถ้าฉันเห็นประตูเปิดฉันจะถือว่าฉันทำได้ ในคำอื่น ๆ ฉันสงสัยเสมอว่า>/dev/nullหมายความว่าcat mybigfile >/dev/nullจริง ๆ แล้วจะประมวลผลทุกไบต์ของไฟล์และเขียนมันเพื่อ/dev/nullที่จะลืมมัน ในทางกลับกันถ้าเชลล์พบ file descriptor ที่ปิดฉันมักจะคิดว่า (แต่ไม่แน่ใจ) ว่ามันจะไม่เขียนอะไรเลยแม้ว่าคำถามcatนั้นจะยังคงอ่านทุกไบต์ ความคิดเห็นนี้พูด>&-และ>/dev/null" ควร " เหมือนกัน แต่มันไม่ได้ดังก้องคำตอบสำหรับฉัน ฉันต้องการคำตอบที่เชื่อถือได้มากขึ้นโดยอ้างอิงถึงแกนมาตรฐานหรือแหล่งข้อมูลบางส่วนหรือไม่ ...

5
แบบพกพาเป็นอย่างไร / dev / stdin, / dev / stdout และ / dev / stderr?
บางครั้งผมต้องระบุเส้นทาง "เทียบเท่า" ของหนึ่งในลำธาร IO มาตรฐาน ( stdin, stdout, stderr) ตั้งแต่ 99% ของเวลาที่ฉันทำงานกับ Linux ฉันแค่เตรียมที่/dev/จะรับ/dev/stdinฯลฯ และสิ่งนี้ " ดูเหมือนจะทำสิ่งที่ถูกต้อง" แต่สิ่งหนึ่งที่ฉันไม่สบายใจเกี่ยวกับเหตุผลดังกล่าวอยู่เสมอ (เพราะแน่นอน "ดูเหมือนว่าจะทำงาน" จนกว่าจะไม่) นอกจากนี้ฉันไม่มีความรู้สึกที่ดีสำหรับวิธีการพกพาในการซ้อมรบนี้ ดังนั้นฉันมีคำถามสองสามข้อ: ในบริบทของลินุกซ์มันมีความปลอดภัย (ใช่ / ไม่ใช่) จะถือเอาstdin, stdoutและstderrด้วย/dev/stdin, /dev/stdoutและ /dev/stderr? โดยทั่วไปแล้วความเท่าเทียมนี้ " พกพาได้อย่างเพียงพอ" หรือไม่? ฉันไม่พบการอ้างอิง POSIX ใด ๆ

3
การทำความเข้าใจ / dev และตำบลและไฟล์ของมัน
$ ls -l /dev/stdin /dev/fd/0 lrwx------ 1 tim tim 64 2011-08-07 09:53 /dev/fd/0 -> /dev/pts/2 lrwxrwxrwx 1 root root 15 2011-08-06 08:14 /dev/stdin -> /proc/self/fd/0 $ ls -l /dev/pts/2 /proc/self/fd/0 crw--w---- 1 tim tty 136, 2 2011-08-07 09:54 /dev/pts/2 lrwx------ 1 tim tim 64 2011-08-07 09:54 /proc/self/fd/0 -> /dev/pts/2 ฉันสงสัยว่าไฟล์ทั้งหมดที่อยู่ภายใต้/devและไดเรกทอรีย่อยนั้นเป็นตัวอธิบายไฟล์ทั้งหมดของอุปกรณ์หรือไม่ …

2
จำกัด จำนวนของตัวให้คำอธิบายไฟล์
ฉันกำลังพยายามติดตั้ง389-dsและมันทำให้ฉันได้รับคำเตือนนี้: WARNING: There are only 1024 file descriptors (hard limit) available, which limit the number of simultaneous connections. ฉันเข้าใจเกี่ยวกับตัวอธิบายไฟล์ แต่ฉันไม่เข้าใจเกี่ยวกับข้อ จำกัด ที่อ่อนและแข็ง เมื่อผมทำงานผมได้รับกลับมาcat /proc/sys/fs/file-max 590432นี่แปลว่าฉันสามารถเปิดไฟล์ได้สูงสุด 590432 ไฟล์ (เช่นมีตัวอธิบายไฟล์สูงสุด 590432 แต่เมื่อฉันวิ่งulimitมันให้ผลลัพธ์ที่แตกต่าง: $ ulimit unlimited $ ulimit -Hn # Hard limit 4096 $ ulimit -Sn # Soft limit 1024 แต่อะไรคือข้อ จำกัด ฮาร์ด …

1
ตัวอธิบายไฟล์ & เชลล์สคริปต์
ฉันมีเวลายากมากที่จะเข้าใจว่าคน ๆ หนึ่งใช้ file descriptor ใน shell script ได้อย่างไร ฉันรู้พื้นฐานเช่น exec 5 > /tmp/foo ดังนั้น fd 5 จะแนบกับ foo เพื่อเขียน exec 6 < /tmp/bar …สำหรับการอ่าน exec 5>&- …ปิด fd ตอนนี้จะทำอะไร? #!/bin/bash exec 5 > /tmp/foo exec 6 < /tmp/bar cat <&6 | while read a do echo $a >&5 done …

3
ลำดับการเปลี่ยนเส้นทาง
ฉันไม่ค่อยเข้าใจว่าคอมพิวเตอร์อ่านคำสั่งนี้อย่างไร cat file1 file2 1> file.txt 2>&1 หากฉันเข้าใจ2>&1เพียงแค่เปลี่ยนเส้นทางข้อผิดพลาดมาตรฐานไปที่เอาต์พุตมาตรฐาน โดยตรรกะนั้นคำสั่งอ่านให้ฉันดังต่อไปนี้: ต่อไฟล์file1และfile2. ส่งจากการดำเนินการนี้stdoutfile.txt ส่งไปยังstderrstdout จบ? ฉันไม่แน่ใจว่าคอมพิวเตอร์กำลังทำอะไรอยู่ โดยตรรกะของฉันคำสั่งควรจะเป็น cat file1 file2 2>&1 > file.txt แต่สิ่งนี้ไม่ถูกต้อง

1
ไวยากรณ์ '<(เนื้อหาไฟล์)' ของ bash คืออะไร
นี้คำตอบเกี่ยวกับความมั่นคง StackExchangeใช้ไวยากรณ์ทุบตีที่น่าสนใจในการสร้างแฟ้มในบรรทัด: openssl req -new -x509 -nodes -newkey ec:&lt;(openssl ecparam -name secp384r1) -keyout cert.key -out cert.crt -days 3650 บิตนี้น่าสนใจเป็นพิเศษ: &lt;(openssl ecparam -name secp384r1) ทำงานเพียง: echo &lt;(openssl ecparam -name secp384r1) ฉันกลับมาแล้ว /dev/fd/63 ดังนั้นนี่จึงเป็นตัวบ่งชี้ไฟล์ชั่วคราวที่มีเนื้อหาของไฟล์ สิ่งนี้เรียกว่าอะไร?

4
fd เดียวกันในกระบวนการต่าง ๆ สามารถชี้ไปที่ไฟล์เดียวกันได้อย่างไร?
ว่าฉันมีขั้นตอนที่ 1และขั้นตอนที่ 2 ทั้งสองมีตัวอธิบายไฟล์ที่สอดคล้องกับจำนวนเต็ม 4 ในแต่ละกระบวนการอย่างไรก็ตามไฟล์ descriptor 4 ชี้ไปที่ไฟล์ต่างกันโดยสิ้นเชิงใน Open File Table ของเคอร์เนล: เป็นไปได้อย่างไร? ไฟล์ descriptor ไม่ควรเป็นดัชนีไปยังระเบียนใน Open File Table หรือไม่

2
อะไรคือจุดประสงค์ของอาร์กิวเมนต์แรกในการเลือกการเรียกของระบบ?
จาก man select int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); nfds เป็นตัวบอกไฟล์ที่มีหมายเลขสูงสุดในสามชุดใด ๆ บวก 1 วัตถุประสงค์ของการคืออะไรnfdsเมื่อเรามีอยู่แล้วreadfds, writefdsและexceptfdsจากการที่อธิบายไฟล์สามารถกำหนด?

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

2
ความสามารถในการพกพาของลิงค์ไฟล์อธิบาย
ฉันสงสัยอยู่เสมอ แต่ไม่เคยใช้เวลาในการค้นหาดังนั้นฉันจะทำตอนนี้ - การใช้งานแบบพกพาแสดงได้อย่างไรจากที่นี่/proc/$$/fd/$Nหรือ /dev/fd/$Nฉันเข้าใจการรับประกัน POSIX /dev/null, /dev/tty, and /dev/console (แม้ว่าฉันจะพบว่าในวันอื่น ๆ หลังจากอ่านความคิดเห็นในคำตอบนี้ )แต่แล้วคนอื่น ๆ เหล่านี้ล่ะ? เท่าที่ฉันสามารถบอกได้ว่าพวกเขาเป็นเรื่องธรรมดา แต่ในระบบใดที่ฉันไม่สามารถคาดหวังว่าจะพบพวกเขา ทำไมจะไม่ล่ะ? มีแนวโน้มที่จะพบหนึ่งมากกว่าอื่น ๆ ? พวกเขาจะแสดงเหมือนแอตทริบิวต์เสมอหรือไม่ ฉันมักจะใช้อุปกรณ์เหล่านี้อย่างกว้างขวางในทุกรูปแบบและฉันอยากจะรู้ว่าถ้ามีโอกาสฉันจะลองสั้น ๆ ควรเข้าใจคำถามข้างต้นเป็นเพียงสิ่งที่ฉันคิดว่าฉันอยากรู้ แต่เนื่องจากฉันต้องถามตั้งแต่แรกฉันอาจไม่ทราบดีที่สุดในเรื่องนี้และพวกเขาไม่ควรพิจารณาข้อกำหนดที่เข้มงวดสำหรับ คำตอบ. กรุณาช่วยฉันด้วยถ้าทำได้โปรดเถอะ


1
วิธียกเลิกการเชื่อมต่อ TCP ที่สร้างโดย bash เอง?
ฉันเคยexec 3&lt;&gt;/dev/tcp/192.168.0.101/6435สร้างการเชื่อมต่อ TCP กับ 192.168.0.101:6435 และฉันได้รับรวมทั้งส่งข้อความสองสามข้อความด้วยpipeคำคำสั่ง ตอนนี้ฉันต้องการยกเลิกการเชื่อมต่อ TCP แต่ด้วยss -anpetฉันสามารถเห็นว่าทุบตีตัวเองถือการเชื่อมต่อนี้โดยไม่ต้องแยกกระบวนการเด็ก ฉันพยายามส่งสัญญาณ 9 และ 15 ไปยังกระบวนการทุบตี แต่อย่างที่ทราบกันว่าทุบตีไม่สามารถฆ่าตัวตายได้ ดังนั้นฉันสามารถยุติการเชื่อมต่อ TCP ที่ฉันสร้างขึ้นได้โดยไม่ยกเลิก pts ที่ฉันกำลังใช้ (ไม่ฆ่าด้วย root หรือส่ง Ctrl + D)?

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