タグ付けされた質問 「fifo」

FIFOに関する質問-先入れ先出しスペシャルファイル、別名名前付きパイプ

5
FIFO、パイプ、UnixドメインソケットはLinuxカーネルでも同じですか?
FIFOは名前付きパイプだと聞きました。そして、それらはまったく同じセマンティクスを持っています。一方、Unixドメインソケットはパイプに非常に似ていると思います(使用したことはありませんが)。だから、彼らはすべてLinuxカーネルの同じ実装を参照しているのだろうか。何か案が?

2
名前付きパイプは「mknod」によって作成され、FIFOは「mkfifo」によって作成されますか?
このmkfifo <file>コマンドを使用して名前付きFIFOを作成しました。1つのプロセスがファイルに書き込み、別のプロセスがファイルから読み取ります。 これで、mknodコマンドが名前付きパイプを作成できることがわかりました。これらの名前付きパイプは、によって作成されたFIFOと同等mkfifoですか、それとも異なる機能がありますか?
22 fifo 

1
名前付きパイプがファイルへの書き込みと同じくらい遅いのはなぜですか?
一方向のプロセス間通信を効率化できるように、名前付きパイプがどのように機能するかを理解しようとしています。データを循環バッファーにコピーするため、オーバーヘッドが発生することが予想されますが、これはRAMに格納されていると考えられますが、ファイルに書き込むよりもパイプがはるかに高速であると予想しました(RAMはディスクよりも桁違いに高速であるため)。 代わりに、名前付きパイプ(または匿名パイプ)がファイルとほぼ同じ速度であることがわかりました。これは、Ubuntu Linuxを実行している通常のディスクドライブ(ソリッドステートではない)を備えた3 GHzデスクトップ上にあります。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 test.py > /dev/null メガバイトごとに2.1マイクロ秒(定数)を生成します。 ファイルへのパイピング: python test.py > /tmp/testout.txt 500マイクロ秒から930マイクロ秒の間でジャンプします(ファイルが大きくなるにつれて、より大きな値がより一般的になります。おそらくディスクスペースを探しているためです)。 次に、名前付きパイプ: mkfifo testpipe cat testpipe > …
18 fifo 

1
平均パイプフロー速度を取得する方法
myfile時間の経過とともに増加している場合は、1秒あたりの行数を取得できます 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。つまり、2つのコマンドは同じように動作します。 cat /dev/xconsole tail -f /dev/xconsole 誰かがその理由を説明してもらえますか? 2つの間に違いはありますか?
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(number行)は行をまたいで状態を蓄積するため、行X、Y、Zのそれぞれに適用されるのは静的な変換ではないことに注意してください。(編集:それがあることが指摘されたnlモードでの缶の仕事が蓄積状態を必要としないが、私はちょうど使用していますnl質問を簡素化するための例として、実際にはコマンドは、より複雑なカスタムスクリプトです。。私が本当に探していますどのようなforは、入力ファイルのサブセクションに標準フィルターを適用する問題の一般的な解決策です) 出力は次のようになります。 line A line B 1 line X 2 line Y 3 line Z line C line D ファイルには、変換を必要とするこのようなセクションがいくつか存在する場合があります。 更新2私はもともと、たとえば次のようなセクションが複数ある場合に何が起こるかを指定しませんでした。 line A line B @@inline-code-start line X line Y line Z @@inline-code-end …


1
Linuxの「漏れやすい」パイプ
次のようなパイプラインがあるとします。 $ a | b bstdinの処理を停止した場合、しばらくしてからパイプがいっぱいになり、astdoutへの書き込みがブロックされます(b処理が再開されるか、終了するまで)。 これを回避したい場合は、次のように大きなパイプ(または、もっと簡単に言うとbuffer(1))を使用したくなるかもしれません。 $ a | buffer | b これは単に私にもっと時間を買ってくれるでしょう、しかしa結局結局止まるでしょう。 (私が取り組んでいる非常に具体的なシナリオの場合)欲しいのは、「リークの多い」パイプを使用して、いっぱいになるとバッファからデータを(理想的には行ごとに)ドロップしてa続行できるようにすることです処理(おそらくご想像のとおり、パイプを流れるデータは使い捨てです。つまり、データを処理することは、ブロックなしで実行できることbほど重要ではありませんa)。 要約すると、境界のある、リーキーなバッファのようなものが欲しいです: $ a | leakybuffer | b おそらくどの言語でも簡単に実装できますが、「すぐに使える」もの(またはbashの1行のようなもの)がないのではないかと思っていました。 注:例では通常のパイプを使用していますが、質問は名前付きパイプにも同様に適用されます 私は以下の回答を授与しましたが、以下の簡単なソリューションにはいくつかの制限があったため、leakybufferコマンドを実装することも決定しました:https : //github.com/CAFxX/leakybuffer
12 linux  pipe  fifo  buffer 

1
SSHFSでinotifyまたは名前付きパイプを使用するにはどうすればよいですか?
sshfs魔法のおかげで、リモートサーバーからホームディレクトリをマウントできます。 sshfs user@server:/home/user ~/remote 楽観的には、ローカルプログラムがリモートログの変更に対応できるように、ローカルinotifyフックを~/remote/logFile(sshfsマウント内に)設定すると思いました。 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を送信する
特定のストリーム(次の場合はstdin)でEOFを読み取ると自動的に終了するプログラムがあります。 次に、名前付きパイプを作成し、プログラムの標準入力をそれに接続するシェルスクリプトを作成します。その後、スクリプトは、パイプへの書き込みを数回使用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 echo some stuff > P # Prevent EOF? cat more_stuff.txt > P # Prevent EOF? send_eof > P # How can I do this? # …

4
プログラム出力リダイレクト
「〜より大きい数字」構文(例:)を使用してプログラム出力をリダイレクトしようとする場合foo 2> myfile、ここで考えられる数字は何であり、それらは何を表していますか? 1は/dev/stdout、2はだと思います/dev/stderr。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ですか? 編集 おそらく、信頼できる方法でc(またはb)プロセスのプロセスIDを見つけることができれば十分でしょう。次に、パイプ全体を非同期で開始し、プロセスIDを待つことができます。の線に沿った何か wait $(a | b | { c & [print PID of c] ; } | d) 編集^ 2 私は解決策を見つけました、コメント(またはより良い解決策)は大歓迎です。
11 bash  shell  pipe  fifo 

3
名前付きパイプ、ファイル記述子、およびEOF
同じユーザーの2つのウィンドウで、bashプロンプトが表示されます。ウィンドウ1で次のように入力します。 $ mkfifo f; exec <f そのため、bashは名前付きパイプにマップされているファイル記述子0から読み取ろうとしていますf。ウィンドウ2で次のように入力します。 $ echo ls > f ここでwindow-1はlsを出力してから、シェルが終了します。どうして? 次の実験:でもう一度window-1を開きますexec <f。ウィンドウ2で次のように入力します。 $ exec 3>f $ echo ls >&3 上記の最初の行の後で、window-1が起動し、プロンプトを出力します。どうして?上述の第2行の後に、ウィンドウ1のプリントls出力とシェル滞在アライブ。どうして?実際、現在window-2でecho ls > f、window-1シェルを閉じません。 答えは、名前付きパイプを参照するwindow-2からのファイル記述子3の存在と関係がある必要がありますか?

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; ); do; echo $index; index=$(( ... このようなジェネレータータイプのオブジェクトをzshに実装する他の方法はありますか? 編集:これは機能しません: #!/usr/bin/env …
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.