คำถามติดแท็ก fifo

คำถามเกี่ยวกับ FIFO - ไฟล์พิเศษเข้าก่อนออกก่อนหรือที่รู้จักกันในชื่อไพพ์

5
FIFO, pipe & Unix socket socket เป็นสิ่งเดียวกันใน Linux kernel หรือไม่?
ฉันได้ยินมาว่า FIFO มีชื่อว่าไพพ์ และพวกเขามีความหมายเดียวกัน ในทางกลับกันฉันคิดว่าซ็อกเก็ตโดเมน Unix ค่อนข้างคล้ายกับไพพ์ (แม้ว่าฉันจะไม่เคยใช้มัน) ดังนั้นฉันสงสัยว่าพวกเขาทั้งหมดอ้างถึงการใช้งานเดียวกันในเคอร์เนล Linux ความคิดใด ๆ

2
ไปป์ที่มีชื่อถูกสร้างขึ้นโดย `mknod` และ FIFO ที่สร้างโดย 'mkfifo` ที่เทียบเท่าหรือไม่
ฉันใช้mkfifo <file>คำสั่งเพื่อสร้างชื่อ FIFOs โดยที่หนึ่งโพรเซสเขียนไฟล์และอีกโพรเซสอ่านจากไฟล์ ตอนนี้ฉันรู้ว่าmknodคำสั่งสามารถสร้างไปป์ที่มีชื่อ ไพพ์ที่มีชื่อเหล่านี้เทียบเท่ากับ FIFO ที่สร้างโดยmkfifoหรือมีคุณสมบัติแตกต่างกันหรือไม่?
22 fifo 

1
เหตุใดไพพ์ที่มีชื่อจึงช้าเท่ากับการเขียนไฟล์?
ฉันพยายามที่จะเข้าใจว่าการตั้งชื่อไปป์นั้นทำงานอย่างไรเพื่อให้ฉันสามารถปรับปรุงการสื่อสารระหว่างทางแบบทางเดียวได้อย่างคล่องตัว ฉันคาดว่าค่าโสหุ้ยเนื่องจากการคัดลอกข้อมูลลงในบัฟเฟอร์แบบวงกลมซึ่งฉันคิดว่าจะถูกเก็บไว้ใน RAM และดังนั้นฉันจึงคาดว่าท่อจะเร็วกว่าการเขียนไปยังไฟล์มาก (เนื่องจาก RAM มีขนาดของคำสั่งเร็วกว่าดิสก์) แต่ฉันพบว่าไปป์ที่มีชื่อ (หรือไปป์ที่ไม่ระบุชื่อ) มีความเร็วประมาณเดียวกับไฟล์ นี่เป็นเดสก์ท็อป 3 GHz ที่มีดิสก์ไดรฟ์ทั่วไป (ไม่ใช่โซลิดสเตต) ซึ่งใช้ Ubuntu Linux นี่คือโปรแกรมทดสอบที่เรียบง่ายใน Python: import sys import time import random megabyte = "".join(random.choice("abcdefghijklmnopqrstuvwxyz") for x in range(1024**2)) while True: before = time.time() sys.stdout.write(megabyte) after = time.time() sys.stderr.write("{} microseconds\n".format(1e6 * (after - before))) ท่อตรงไปที่/dev/null: python …
18 fifo 

1
วิธีรับความเร็วการไหลของท่อโดยเฉลี่ย
หากmyfileเพิ่มขึ้นเมื่อเวลาผ่านไปฉันจะได้รับจำนวนบรรทัดต่อวินาทีโดยใช้ tail -f | pv -lr > /dev/null มันให้ความเร็วทันทีไม่ใช่ค่าเฉลี่ย ฉันจะรับความเร็วเฉลี่ยได้อย่างไร (เช่นอินทิกรัลของฟังก์ชั่นความเร็วv(t)ตลอดเวลาการตรวจสอบ)
16 pipe  monitoring  tail  fifo  pv 

3
การอ่านอย่างต่อเนื่องจากไปป์ที่มีชื่อ (cat หรือ tail -f)
ฉันได้กำหนดค่าrsyslogให้บันทึกเหตุการณ์การบันทึกบางอย่างไปที่/dev/xconsole: *.*;cron.!=info;mail.!=info |/dev/xconsole /dev/xconsoleเป็นชื่อไปป์ ( fifo) cat /dev/xconsoleถ้าผมต้องการที่จะเห็นสิ่งที่จะถูกบันทึกไว้ที่ฉันสามารถทำได้ ฉันกำลังแปลกใจที่จะเห็นว่าคำสั่งcat /dev/xconsoleไม่เสร็จสมบูรณ์หลังจากที่ได้อ่านไฟล์ tail -fแต่แทนที่จะทำหน้าที่เป็น กล่าวอีกนัยหนึ่งทั้งสองคำสั่งทำงานเหมือนกัน: cat /dev/xconsole tail -f /dev/xconsole ใครช่วยอธิบายหน่อยได้ไหมว่าเพราะอะไร มีความแตกต่างระหว่างสองคนนี้ไหม?
16 pipe  cat  tail  fifo 

9
กรองหรือไพพ์บางส่วนของไฟล์
ฉันมีไฟล์อินพุตที่มีบางส่วนและถูกแบ่งเขตด้วยแท็กเริ่มต้นและแท็กสิ้นสุดตัวอย่างเช่น: line A line B @@inline-code-start line X line Y line Z @@inline-code-end line C line D ฉันต้องการนำการแปลงไปใช้กับไฟล์นี้เพื่อให้บรรทัด X, Y, Z ถูกกรองผ่านคำสั่งบางอย่าง ( nlตัวอย่างเช่น) แต่ส่วนที่เหลือของบรรทัดนั้นไม่ผ่านการเปลี่ยนแปลง โปรดสังเกตว่าnl(จำนวนบรรทัด) สะสมสถานะข้ามบรรทัดดังนั้นจึงไม่ใช่การแปลงแบบสแตติกที่ถูกนำไปใช้กับแต่ละบรรทัด X, Y, Z ( แก้ไข : มันชี้ให้เห็นว่าnlสามารถทำงานในโหมดที่ไม่ต้องการสถานะสะสม แต่ฉันแค่ใช้nlเป็นตัวอย่างในการทำให้คำถามง่ายขึ้นในความเป็นจริงคำสั่งเป็นสคริปต์ที่กำหนดเองที่ซับซ้อนมากขึ้นสิ่งที่ฉันกำลังมองหา for เป็นคำตอบทั่วไปสำหรับปัญหาในการใช้ตัวกรองมาตรฐานกับส่วนย่อยของอินพุตไฟล์ ) ผลลัพธ์ควรมีลักษณะดังนี้: line A line B 1 line X 2 line Y 3 …


1
ท่อ“ รั่ว” ใน linux
สมมติว่าคุณมีไพพ์ไลน์ดังนี้: $ a | b หากbหยุดการประมวลผล stdin หลังจากนั้นไม่นานท่อจะเต็มและเขียนจากaไปยัง stdout จะบล็อก (จนกว่าจะbเริ่มการประมวลผลอีกครั้งหรือไม่ก็ตาย) หากฉันต้องการหลีกเลี่ยงสิ่งนี้ฉันอาจถูกล่อลวงให้ใช้ท่อขนาดใหญ่กว่า (หรือมากกว่านั้นbuffer(1)) ได้เช่น: $ a | buffer | b นี่จะซื้อเวลาให้ฉันมากขึ้น แต่ในที่สุดaก็จะหยุด สิ่งที่ฉันชอบ (สำหรับสถานการณ์ที่เฉพาะเจาะจงมากที่ฉันกำลังพูดถึง) คือการมีท่อ "รั่ว" ที่เมื่อเต็มแล้วจะลดลงข้อมูลบางส่วน (นึกคิดทีละบรรทัดโดยบรรทัด) จากบัฟเฟอร์เพื่อให้aดำเนินการต่อ การประมวลผล (อย่างที่คุณคงจินตนาการได้ว่าข้อมูลที่ไหลในไพพ์นั้นมีค่าใช้จ่ายนั่นคือการมีข้อมูลที่ประมวลผลโดยbมีความสำคัญน้อยกว่าการaวิ่งโดยไม่ปิดกั้น) เพื่อสรุปมันขึ้นมาฉันชอบที่จะมีบางสิ่งบางอย่างเช่นบัฟเฟอร์ที่มีขอบเขตและมีรอยรั่ว: $ a | leakybuffer | b ฉันอาจใช้มันได้อย่างง่ายดายในภาษาใด ๆ ฉันแค่สงสัยว่ามีบางสิ่งที่ "พร้อมใช้" (หรือบางสิ่งบางอย่างเช่นทุบตีสายการบินเดียว) ที่ฉันขาดไป หมายเหตุ: ในตัวอย่างที่ฉันใช้ไพพ์ทั่วไป แต่คำถามก็ใช้ได้กับไพพ์ที่ตั้งชื่อด้วย ในขณะที่ฉันได้รับคำตอบด้านล่างฉันก็ตัดสินใจที่จะใช้คำสั่ง leakybuffer เพราะวิธีง่ายๆด้านล่างมีข้อ …
12 linux  pipe  fifo  buffer 

1
ฉันจะใช้ inotify หรือตั้งชื่อ pipes ผ่าน SSHFS ได้อย่างไร
ด้วยsshfsความมหัศจรรย์ฉันสามารถติดตั้ง dir บ้านของฉันจากเซิร์ฟเวอร์ระยะไกลด้วย sshfs user@server:/home/user ~/remote ในแง่ดีฉันคิดว่าฉันตั้งค่าโลคัลinotify-hook on ~/remote/logFile(ในsshfsmount) ดังนั้นโปรแกรมโลคัลสามารถตอบสนองต่อการเปลี่ยนแปลงบันทึกระยะไกล cd ~/remote touch logFile # create remote file inotifywait logFile & # set up local inotify-hook ssh user@server -x touch /home/user/logFile # touch file from remote ไม่มีอะไรเกิดขึ้น inotifywaitจะเงียบถ้าฉันtouchไฟล์ในเครื่อง การเขียนไปป์ที่มีชื่อล้มเหลวในทำนองเดียวกัน ทำไมนี้ ฉันจะเชื่อมช่องว่างนี้ได้อย่างไร ฉันสามารถเรียกใช้inotifywaitจากระยะไกลแฮ็คอัพระบบไฟล์ให้เปลี่ยนกลยุทธ์การทำให้เป็นอนุกรมและรักษาการเชื่อมต่อกับโลคัล แต่โดยทั่วไปแล้วฉันใช้ SSHFSอีกครั้ง และมันก็ฆ่าสิ่งที่เป็นนามธรรมอย่างสมบูรณ์
12 sshfs  inotify  fifo 

3
ป้องกัน EOF อัตโนมัติไปที่ไปป์ที่มีชื่อและส่ง EOF เมื่อฉันต้องการ
ฉันมีโปรแกรมที่ออกโดยอัตโนมัติเมื่ออ่าน EOF ในสตรีมที่กำหนด (ในกรณีต่อไปนี้ stdin) ตอนนี้ฉันต้องการสร้างเชลล์สคริปต์ซึ่งสร้างไพพ์ที่มีชื่อและเชื่อมต่อ stdin ของโปรแกรม จากนั้นสคริปต์จะเขียนไปยังไพพ์หลายครั้งโดยใช้echoและcat(และเครื่องมืออื่น ๆ ที่สร้าง EOF โดยอัตโนมัติเมื่อพวกเขาออก) ปัญหาที่ฉันเผชิญคือเมื่อสิ่งแรกechoเสร็จแล้วมันจะส่ง EOF ไปที่ไพพ์และทำให้โปรแกรมออกจาก ถ้าฉันใช้บางอย่างเช่นtail -fนั้นฉันจะไม่สามารถส่ง EOF เมื่อฉันตั้งใจจะออกจากโปรแกรม ฉันกำลังค้นคว้าวิธีแก้ปัญหาที่สมดุล แต่ก็ไม่มีประโยชน์ ฉันพบวิธีป้องกัน EOF และวิธีส่ง EOF ด้วยตนเองแล้ว แต่ไม่สามารถรวมเข้าด้วยกันได้ มีคำใบ้อะไรบ้าง? #!/bin/sh mkfifo P program < P & : # Run in background # < P tail -n +1 -f | program …

4
การเปลี่ยนเส้นทางเอาต์พุตโปรแกรม
เมื่อพยายามเปลี่ยนเส้นทางผลลัพธ์ของโปรแกรมโดยใช้ "ตัวเลขบางส่วนที่มากกว่า" ไวยากรณ์ (เช่นfoo 2> myfile) ตัวเลขที่เป็นไปได้ที่นี่คืออะไรและเป็นตัวแทนของอะไร ผมเชื่อว่า 1 /dev/stdout, /dev/stderr2 แล้ว 5 และ 6 ล่ะ มี 3, 4 หรือจำนวนมากกว่า 6?

6
ท่อกึ่งอะซิงโครนัส
สมมติว่าฉันมีท่อต่อไปนี้: a | b | c | d ฉันจะรอให้เสร็จสิ้นการc(หรือb) ในshหรือbash? ซึ่งหมายความว่าสคริปต์dสามารถเริ่มต้นได้ตลอดเวลา (และไม่จำเป็นต้องรอ) แต่ต้องการเอาต์พุตที่สมบูรณ์จากcการทำงานอย่างถูกต้อง กรณีการใช้งานมีdifftoolไว้สำหรับgitเปรียบเทียบรูปภาพ มันถูกเรียกใช้โดยgitและต้องการประมวลผลอินพุต ( a | b | cส่วน) และแสดงผลลัพธ์ของการเปรียบเทียบ ( dส่วน) โทรจะลบการป้อนข้อมูลที่จำเป็นสำหรับการและa bซึ่งหมายความว่าก่อนที่จะส่งคืนจากสคริปต์กระบวนการc(หรือb) จะต้องยุติ ในทางกลับกันฉันไม่สามารถรอได้dเพราะนี่หมายความว่าฉันกำลังรอการป้อนข้อมูลจากผู้ใช้ ฉันรู้ว่าฉันสามารถเขียนผลของการcไปยังแฟ้มชั่วคราวหรืออาจจะใช้ FIFO bashใน (ไม่แน่ใจว่า FIFO จะช่วยได้หรือไม่) เป็นไปได้ไหมหากไม่มีไฟล์ชั่วคราวsh? แก้ไข อาจจะเพียงพอหากฉันสามารถหา ID กระบวนการของกระบวนการc(หรือb) ในแบบที่เชื่อถือได้ จากนั้นไพพ์ทั้งหมดสามารถเริ่มต้นแบบอะซิงโครนัสได้และฉันอาจรอรหัสกระบวนการ บางสิ่งบางอย่างตามแนวของ wait $(a | b | { c & …
11 bash  shell  pipe  fifo 

3
ไพพ์เนม, ตัวอธิบายไฟล์และ EOF
สองหน้าต่างผู้ใช้เดียวกันพร้อมกับ bash พร้อมต์ ในประเภท window-1: $ mkfifo f; exec <f ดังนั้นทุบตีอยู่ในขณะนี้พยายามอ่านจากไฟล์อธิบาย 0 fซึ่งถูกแมปไปไปป์ที่มีชื่อ ในประเภท window-2: $ echo ls > f ตอนนี้ window-1 จะพิมพ์ ls แล้วเชลล์ก็จะตาย ทำไม? ทดลองถัดไป: เปิดหน้าต่าง-1 exec <fอีกครั้งกับ ในประเภท window-2: $ exec 3>f $ echo ls >&3 หลังจากบรรทัดแรกด้านบน window-1 จะปลุกและพิมพ์พรอมต์ ทำไม? หลังจากบรรทัดที่สองข้างต้น window-1 จะพิมพ์lsเอาต์พุตและเชลล์ยังมีชีวิตอยู่ ทำไม? อันที่จริงตอนนี้ใน window-2 echo …

3
วิธีใช้“ เครื่องกำเนิดไฟฟ้า” เช่น $ RANDOM ได้อย่างไร
ตัวแปรพิเศษ$RANDOMมีค่าใหม่ทุกครั้งที่เข้าถึง ในแง่นี้มันชวนให้นึกถึงวัตถุ "เครื่องกำเนิด" ที่พบในบางภาษา มีวิธีที่จะใช้บางสิ่งเช่นนี้zshหรือไม่? ฉันพยายามทำสิ่งนี้ด้วยไพพ์ที่มีชื่อ แต่ฉันไม่พบวิธีที่จะแยกไอเท็มจาก Fifo ในลักษณะที่ควบคุมได้โดยไม่ต้องฆ่ากระบวนการ "ตัวสร้าง" ตัวอย่างเช่น: % mkfifo /tmp/ints % (index=0 while ( true ) do echo $index index=$(( index + 1 )) done) > /tmp/ints & [1] 16309 % head -1 /tmp/ints 0 [1] + broken pipe ( index=0 ; while ( true; ); …
10 zsh  fifo  ipc 

2
mkfifo - ดิสก์ I / O เกิดขึ้นจริงหรือไม่
ฉันมี 2 แอปพลิเคชัน: ผู้ผลิต (อินสแตนซ์ N) ผู้บริโภค (1 อินสแตนซ์) ฉันกำลังเขียนออกกลางผลมาจากผู้ผลิตและผู้บริโภคแล้วอ่านไฟล์เหล่านี้จากดิสก์และผลิตสุดท้ายผล ฉันต้องการลด I / O นี้ให้น้อยที่สุดโดย "สตรีมมิ่ง" ผลลัพธ์จากผู้ผลิตโดยตรงไปยังผู้บริโภค ฉันมาข้ามท่อชื่อ (mkfifo) และเป็นตัวอย่างที่ตามมาที่นี่ สิ่งนี้ดูดี แต่สิ่งที่ฉันไม่สามารถระบุได้ว่าจะนำไปใช้จริงได้อย่างไร คิว FIFO เพิ่งถูกบัฟเฟอร์ผ่านไฟล์หรือไม่? ถ้าเป็นเช่นนั้นอาจจะไม่ช่วยฉัน ฉันต้องการเนื้อหาที่จะสตรีม "ผ่านหน่วยความจำ" ทั้งหมดโดยไม่ต้องใช้ดิสก์ บางทีนี่อาจเป็นไปไม่ได้ในกระบวนการต่างๆ
10 io  fifo 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.