問題タブ [poll-syscall]
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.
c++ - 入力がないのに poll が返されるのはなぜですか?
と話す方法を理解するための小さなテスト プログラムを作成しましたpoll
。testa
、testb
、 の3 つのファイルを作成し、最初のファイルにtestc
文字列を書き込みましたhello\n
。だから、ここに私の呼び出しがありますpoll
:
マンページによると、タイムアウトは、システムコールがタイムアウトし-1
ないことを示す必要があります。しかし、何も読むことができずに戻ってきます。私は常に入力の 1 バイトを消費し、印刷されているのを見ることができますhello\n
が、ポーリングはそこで止まりません。読むものがあるふりをし続けるだけです。
私が得るものはこれです:
(最後の 2 行を永久に繰り返します)
私はg++ -Wall -Wextra -std=c++11 poll.cpp -o poll
3.10-2-amd64 カーネルでビルドしています。
c - このベンチマーク コードがこれほど高い CPU を使用しているのはなぜですか?
以下のコードは機能し、正しいデータをすべて送信し、正しいデータを受信しています。
非常に高速なサーバーのベンチマークに使用すると、ベンチマークの CPU 使用率は ~10% です。ただし、遅いサーバーのベンチマークを行うと、ベンチマーク/ストレス テストを行っているサーバーと同じように、50% まで上昇します*。
それはtop
報告しているとおりです。
なぜそんなに多くのCPUを使用するのでしょうか? poll を悪用していると思われますが、方法がわかりません。
低速サーバーの CPU 時間はベンチマークの 4 倍であり、高速サーバーの CPU 時間はベンチマークの 7 倍です。
* (今のところ、ベンチマークとサーバーの両方を同じマシンで実行しています。通信は TCP 経由です。)
linux - Linux ソケットの POLLERR、POLLHUP、POLLNVAL を処理するにはどうすればよいですか?
ポーリングがこれらのビットを設定したときに何をすべきか疑問に思っていますか? ソケットを閉じるか、無視しますか?
c - POLLHUP と POLLNVAL、または POLLHUP とは何ですか?
マンページは、poll(2) について次のように述べています。
POLLHUP - 電話を切る (出力のみ)
POLLNVAL - 無効な要求: fd が開いていません (出力のみ)
違いは正確には何ですか?ファイル記述子を閉じるとトリガーされる簡単なプログラムをPOLLNVAL
作成し、閉じたfdから読み取ろうとします。ただし、を返す方法がわかりませんPOLLHUP
。
c - poll を使用して複数のクライアントを受け入れるにはどうすればよいですか? (TCP サーバー) (C)
このポーリング ビジネスは狂人によって書かれたように思えます。複数のクライアントがサーバーに接続し、入力を他のすべてのクライアントに送信できるようにする方法がわかりません。
したがって、3 つのクライアントを使用する場合は、次のようなものが必要になります。
そして、メッセージを読み書きできるようにするには、正確に何をしますか?
c - ポーリングが POLLIN と POLLERR を返した後の Read()
ネットワーク接続管理用の aysnc スレッドプール モデルがあります。poll() を呼び出し続ける単一のディスパッチャ スレッドと、poll() がそのように示すと読み取り/書き込みを行うワーカー スレッド プール。
poll() がソケットが読み取り可能であることを示している場合を考えてみましょう。しかし、ワーカー スレッドはまだ読み取りを処理していません。ワーカー スレッドが読み取りを処理していない間、読み取りポーリングを無効にします。これで、リモート側が切断され、poll() は POLLERR/POLLHUP で戻ります。この後、ワーカー スレッドが read() を呼び出すとどうなりますか?
まだ読み取られていないデータがある場合でも、read() は <0 を返しますか? または
ソケットに POLLERR/POLLHUP があったとしても、read() はネットワークからデータを読み取りますか?
c - ピアがハングアップした後でも、poll() は POLLIN イベントを返すことができますか?
ソケットがピアによって閉じられた後でも、poll() システム コールが POLLIN イベントを返すことがわかります。POLLIN と POLLERR の両方が設定されています。これは、read() 呼び出しが -1 を返した後でも発生し続けます。
私のロジックは、POLLIN がない場合にのみ POLLERR を処理し、ソケットが切断される前に既に到着したパケットを確実に読み取るようにします。その結果、POLLIN は常に設定されているため、POLLERR を処理することはありません。
ソケットエラーの後に poll() が POLLERR とともに POLLIN を返すのはなぜですか? そして、このシナリオをどのように処理する必要がありますか。
ありがとう!