問題タブ [fifo]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - アプリケーション (Java) の入力をリダイレクトするが、BASH で stdin を許可する
私は少し混乱しています。これは昨日機能していましたが、ほとんど魔法のように、リダイレクトされた stdin の受け入れを停止しました。
これは問題なく実行され、inputfifo にエコーすることができ、アプリはそれを取得し、コンソールに直接入力することもできました。それはスクリーンを通してさえ働きました。コード的には何も変更されていませんが、リダイレクトされた標準入力は機能しなくなりました。ファイル記述子を 9 または 127 に変更しようとしましたが、どちらも修正されませんでした。
私は何かを忘れていますか?壊れて機能しなくなった特定の理由はありますか?
(画面を切り離して起動し、少なくとも一度接続されていない限り入力の受信を拒否するため、画面自体に入力を送信する代わりにこれを使用しています。これがバグなのか意図されたものなのかはわかりません)
list - SWIプロローグ:相違点リスト-fifo
私はPrologを学んでいて、違いのリストは私にとって非常に新しく、地獄のように見えます。特に、私は間違いなく貧弱な単純なC++の人です:)私は自分のタスクに問題があります:
addall(-E、+ G、+ S、-R)は、目標G(変数Eが発生する)を満たす変数Eの置換のすべての結果をコレクションSに追加し、新しいコレクションRを返します(この述語は次のようになります)。標準述語findall=3およびfindall=4)。
私はこれをLIFOコレクションで問題なく実装しましたが、FIFOに問題があります。次の使用法を検討してください。
大丈夫です、コレクションWは[8,6,4,2,0]ですが:
私に与えますW = [9, 7, 5, 3|[1|_G3761]-_G3761]
。私が欲しいのはです[9,7,5,3,1|_G3761]-_G3761
。何が悪いのか、特に次のことがわかりません。
うまく動作します。私のコード:
前もって感謝します。
file-io - 名前付きパイプブロックを読み取り専用で開くのはなぜですか?
Pythonを使用してUNIX(Linux、FreeBSD、MacOS X)のさまざまなフレーバーで名前付きパイプ(FIFO)を処理するときに、いくつかの奇妙なことに気づきました。最初の、そしておそらく最も厄介なのは、空/アイドルのFIFOを読み取り専用で開こうとするとブロックされることです(os.O_NONBLOCK
下位レベルのos.open()
呼び出しで使用しない限り)。ただし、読み取り/書き込み用に開くと、ブロッキングは発生しません。
例:
なぜか気になります。後続の読み取り操作ではなく、オープンコールがブロックされるのはなぜですか?
また、非ブロッキングファイル記述子がPythonでさまざまな動作を示す可能性があることにも気づきました。最初の開く操作にを使用する場合os.open()
、ファイル記述子でデータの準備ができていない場合、は空の文字列を返すようです。ただし、使用すると例外が発生します()os.O_NONBLOCK
os.read()
fcntl.fcnt(f.fileno(), fcntl.F_SETFL, fcntl.GETFL | os.O_NONBLOCK)
os.read
errno.EWOULDBLOCK
open()
私の例では設定されていない、通常によって設定されている他のフラグはありos.open()
ますか?それらはどのように異なり、なぜですか?
c# - c#限定辞書
ディクショナリ(キー、値)を作成したいのですが、このディクショナリのサイズを制限して、たとえば1000エントリにしたいので、この制限サイズを豊富に使用する場合は、最初の要素を削除して新しい要素(FIFO)を追加します。 。
私はいつも辞書でキーを検索しているので、辞書を使いたいです(高速である必要があります)
これを行う方法?
c# - 新しいエンキュー時に古い値を自動的にデキューする固定サイズのキュー
ConcurrentQueue
最後に渡された N 個のオブジェクト (一種の履歴) を保持することを目的とした共有データ構造に使用しています。
ブラウザーがあり、最後に閲覧した 100 個の URL を取得したいとします。容量がいっぱいになると、新しいエントリの挿入 (エンキュー) 時に最も古い (最初の) エントリを自動的にドロップ (デキュー) するキューが必要です (履歴の 100 アドレス)。
を使用してそれを達成するにはどうすればよいSystem.Collections
ですか?
bash - この init.d 起動スクリプトで FIFO を使用する方法を理解するのに苦労しています
概要: init.d 起動スクリプトで名前付きパイプを使用する方法を探しています。起動時にパイプが機能せず、それを殺す方法がわかりません。
Minecraft サーバーを起動するために Ubuntu 10.04 x64 で使用しているこの起動スクリプトがあります。シェルからサーバーにコマンドを渡すことができるように、読み取り FIFO をセットアップする必要があります。.fifo ファイルを作成しました。次のようにシェルからサーバーを手動で起動すると、うまく機能します。
私が苦労しているのは、そのテール -f minecraft.fifo を init スクリプトにプラグインするときです。サービスを開始すると、「tail -f minecraft.fifo」が起動します。しかし、シェルから手動で起動したときのように、Minecraft サーバーにコマンドを渡しません。
また、名前付きパイプを停止する方法がわかりません。これまでのところ、プロセスの PID を保存し、停止中にその PID を強制終了する必要があると考えています。しかし、$ から PID を取得する方法がわかりません! リコールできるように変数に入れます。
わかる?呼び出したときにテールが機能せず、テール プロセスを強制終了する方法がわかりません。
名前付きパイプを含まない、機能している起動スクリプトを次に示します。
DAEMON 変数をそのように変更すると、スクリプトはそれを開始し、末尾 -f は ps -ef で見つけることができます。
しかし、コマンドを minecraft.fifo にエコーすると、サーバーはそれを読み取りません。ps を見ると、実際には tail -f minecraft.fifo が別のプロセスで開始されているようです。それが問題かもしれません。
注: 実行中のサーバーにジャンプしてコマンドを発行する方法が必要だったため、SCREEN コマンドを使用して DAEMON を呼び出しています。したがって、ユーザー minecraft として -r をスクリーニングするだけで、サーバーを操作できます。ただし、この fifo が機能するようになると、画面の要素は必要なくなります。それで邪魔になったら取り外せます。
殺すのもよし。mc_stop に killall テールを配置すると、機能します。しかし、それはすべての尾を殺し、私は殺したくない他のものを実行しています。これまでのところ、PID を使用して強制終了できるように、PID を格納する方法でサーバーを起動する方法を理解していません。または、テールを一意のプロセス名で開始して、他のテールを危険にさらすことなくすべてを強制終了できるようにします。
名前付きパイプを使用してサーバーを適切に起動する方法についての考え; そして、それを適切に停止する方法は?
c - Unixfifoクライアントからサーバーへ
次のような方法でUnixFIFOのペアを使用したいと思います。
- クライアントはサーバーにファイル名を送信し、
- サーバーはクライアントに戻ります:指定されたファイルからの単語数、行数、バイト数。
手伝ってもらえますか?
client.c
server.c
私はいくつかの改善を行いましたが、それでも正しく機能しません。
unix - FIFOが閉じないようにする/閉じたFIFOを再利用する
次のシナリオを検討してください。
名前の付いたFIFOtest
が作成されます。あるターミナルウィンドウ(A)で実行cat <test
し、別のターミナルウィンドウ(B)で実行しcat >test
ます。これで、ウィンドウBに書き込み、ウィンドウAで出力を取得できるようになりました。プロセスAを終了して再起動しても、このセットアップを疑わしいものとして使用することもできます。ただし、ウィンドウBでプロセスを終了すると、Bは(私が知る限り)FIFOを介してEOFをプロセスAに送信し、それも終了します。
実際、EOFで終了しないプロセスを実行した場合でも、プロセスにリダイレクトしたFIFOを使用することはできません。これは、このFIFOが閉じていると見なされるためだと思います。
この問題を回避する方法はありますか?
この問題が発生した理由は、スクリーンセッションで実行されているMinecraftサーバーにコマンドを送信したいためです。例:echo "command" >FIFO_to_server
。これはおそらくスクリーンを単独で使用することで可能ですが、私はスクリーンにあまり慣れていません。パイプのみを使用する解決策は、より単純でクリーンなものになると思います。
c - CでのFIFOへの構造体の読み取り/書き込み
名前付きパイプを使用してプロセス間で構造体を渡そうとしています。パイプの非ブロッキングモードを開こうとして立ち往生しました。これがFIFOに書き込むための私のコードです:
routing_tableは私の構造体へのポインタであり、割り当てられているので、そのようなfifoまたはsmthの名前のprobはありません。O_NONBLOCKオプションを指定せずにFIFOを開くと、初めてsmthが書き込まれますが、構造体の読み取りにも問題があるため、ブロックされます。そして、最初の後に、最初のFIFOが作成されますが、「。」、「..」という名前の他のFIFOが表示されます。O_NONBLOCKオプションを設定すると、FIFOが作成されますが、常にエラーがスローされます:'そのようなデバイスまたはアドレスはありません'。なぜこれが起こるのか考えていますか?ありがとう。
編集:わかりました。これで、FIFOを開くことについては明確になりましたが、別の問題があります。実際、FIFOへの構造体の読み取り/書き込みが最初の問題でした。構造体を読み取るための私のコード:
これはFIFOを開いて読み込もうとしますが、FIFOには何も入っていないようですが、writeUpdateでは最初に4バイトを書き込んだと表示されます(これも間違っているようです)。読み取り時に、最初は'a'を出力し、その後num_bytesは常に<=0になります。私は周りを見回して、単純な書き込み/読み取りでこの例を見つけただけですが、構造体を書くときにもっと必要なものはありますか?
私の構造は次のようになります:
java - リーダーを使用した循環バッファー
シーク可能なリーダーをサポートする循環バッファーの実装が必要です。私のユースケース:
私のコードでは、ログ メッセージを収集します。最終的に、ユーザーは適切にフォーマットされたページにアクセスする可能性があります。メッセージで RAM がいっぱいにならないようにするには、固定サイズの FIFO 構造が必要です。ユーザーが長時間ページにアクセスしないと、メッセージがドロップされます。それで大丈夫です。
ユーザーがページにとどまっている限り、新しいログ メッセージがページに追加されます。JavaScript を介して、ユーザーは保持するメッセージの数を定義できます。これは、アプリのバッファ サイズとは完全に無関係です。したがって、新しい要素を反復処理するために使用できるデータ構造のリーダーが必要です。
ユーザーがページを再読み込みするか、初めて読み込む場合は、リーダーを FIFO 内の最も古い要素に設定する必要があります。
メッセージが追加されると、リーダーを更新する必要があります。ブラウザーが新しいメッセージを十分な速さで取得できない場合、リーダーは最終的に FIFO 内の最も古いメッセージを指す必要があります。つまり、ユーザーはいくつかのメッセージを見逃す可能性があります。これは完璧ではありませんが、まれなケースです。読者が「メッセージを 5 つ逃した」と言ってくれれば完璧ですが、それがなくても生きていけます。
これを提供する既存の実装を知っていますか?