問題タブ [select-function]

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.

0 投票する
1 に答える
7662 参照

c - 次のコマンドで「リソースが一時的に利用できません」と表示されるのはなぜですか?

次のコードが 80% の確率で「read(): リソースが一時的に利用できません」と表示されるのはなぜですか? これは EAGAIN コードです。これは、読み取り待ちのデータがないことを意味する WOULD BLOCK と同じですが、select はデータがあることを示す 1 を返します (Linux でテスト済み)。

0 投票する
1 に答える
1008 参照

c - C での Select() の問題 (windows 7)

既に達成したマルチスレッドとは対照的に、select() を使用して複数のクライアントを処理するサーバーを作成しようとしています。ただし、 select() は何もしていないようです? 私はすべての必要なシステム コールを持っています。bind() から listen() まで、すべて適切なエラー チェックが行われ、問題は返されません。また、問題なくコンパイルされます。

クライアントは接続を確立できませんが、WSAGetLastError() はクライアント側で 0 を返します。また、サーバーは、タイムアウトのために 0 を返すことを除けば、決して select() を渡されません。私のコードで問題を確認するのに本当に苦労しています。

0 投票する
1 に答える
812 参照

c - パイプと select() に問題がある

パイプと選択に問題があるようです。

コンテキスト: シェルで実行される何かをプログラムする必要があります:
logn [--tick n] cmd [args] [, cmd [args]]...

基本的には、複数のプログラムを同時に実行するプログラムです。

制約: 各出力行は、printf "%d: %s" の形式で前にコマンド番号を付けて開始する必要があります。
つまり:

tick が指定されている場合、出力が n 秒間送信されない場合、システムはピリオドを出力します。select() を使用する必要があります。最後の出力がピリオドであった場合、システムは別のピリオドを出力しません。

問題:

  1. 2 番目のコマンドの出力は、最初のパイプの p[0] に出力されるようです。
    p[0][0] を読み込むと、p[1][0] に送信されたものを取得します。p[1][0] には何もないようです。

  2. 私の選択がタイムアウトに遭遇するたびに、そこで立ち往生しているようです。

以前にも質問したので、おなじみかもしれません。話が変わったので、新たに投稿しました。古い投稿は、フォークを理解するのに大いに役立ちました。

これが私のコードです:

0 投票する
1 に答える
315 参照

c - ソケットの select() (トラブル)

最近、コードのこの部分を実行しました。

それは機能しますが、select() はうまく機能しません。
サーバーから最後の応答を取得すると、応答文字列の先頭にいくつかの奇妙な文字を含む最後の応答文字列を繰り返し始めます。だからこれを見てください:

最初の文字列は、サーバーからの最後の応答です。したがって、次の文字列は単なるがらくたです。いくつかの検索エンジンで情報を探してみましたが、うまくいきませんでした。

0 投票する
2 に答える
118 参照

c - Cプログラムでは失敗するがシェルでは失敗しない選択

親と子のプロセスがあり、親は子から出力を読み取り、子の入力に送信できます。これまでのところ、すべてがシェル スクリプトで正常に動作しており、データを入出力するコマンドをテストしています。簡単な C プログラムでテストしたところ、動作しませんでした。Cプログラムは次のとおりです。

C プログラムの問題は、select が子 fd からの読み取りに失敗し、プログラムを終了できないことです。選択を行うビットは次のとおりです。

これがシェルプログラムではなくCプログラムで発生する理由を知っている人はいますか?

編集:子プロセスが引数で exec を呼び出すことを指摘する必要があるため、その時点以降は子プロセスにアクセスできません。

0 投票する
2 に答える
7020 参照

c - C ソケット プログラミング: サーバーからメッセージが送信されたにもかかわらず、select() が 0 を返す

TCP/IP を使用して、サーバーからのメッセージにselect()使用しています。recv()サーバーからメッセージをsend()送信すると、適切な数のバイトが返され、送信が成功したことが示されます。whileそして、 loop to justを使用すると、クライアントに正常に到達しますrecv()。すべてがうまくてダンディです。

ただし、 を使用しようとするとselect()select()タイムアウト (1 秒に設定) から 0 が返され、私の人生では、サーバーから送信されたメッセージが表示されない理由がわかりません。また、サーバーが切断されたときもそれがselect()表示されないことにも言及する必要がありrecv()ます. ご意見やご感想をお待ちしております。

0 投票する
3 に答える
393 参照

c - 動作を選択

おそらく簡単な質問かもしれませんが、明確な答えを見つけることができませんでした。C コードに複数のスレッドがあり、そのうちの 1 つは select を使用して n 秒間待機します。私が持っている質問は、プロセス全体を n 秒間ブロックするか (usleep のように)、呼び出しスレッドのみを選択してブロックするか (nanosleep のように) です。答えてくれてありがとう。

0 投票する
1 に答える
2044 参照

c - select() の問題と最後にシグナル SIGUSR1 を送信する (C 言語)

私は、N個の子(マップ)+ 1(縮小)を生成する親を持つ古典的なマップ縮小プログラムを実装しています。親は、名前のないパイプを介して、N 個の子のそれぞれに情報を送信します。マップはリクエストを処理し、結果の int を reduce に送信します。reduce は select を実行し、map から reduce へのパイプに書き込まれたすべてのカウンターを合計します。

最後に、reduce は結果とともにシグナル SIGUSR1 を送信する必要がありますが、シグナル ハンドラで常に o を出力するため、コードは何度も間違って送信します。コードの一部です:

親では、パイプと子を作成した後、次のようなものがあります。

問題は、削減プロセスが正しく合計され、正しく出力されることですが、シグナルが何度も送信されているため、1 つだけが必要です。グローバル変数の結果。

どうやってやるの?reduce に何か問題がありますね。

0 投票する
5 に答える
39246 参照

c - C、ソケットプログラミング:select()を使用して複数のクライアントをサーバーに接続する

複数のクライアントから接続できるサーバーを作ろうとしています。これまでの私のコードは次のとおりです。

クライアント:

サーバ:

クライアントが接続して最初のメッセージを送信するとすぐに、サーバーは無限ループで実行され、メッセージ配列からガベージを吐き出します。recvは何も受信していないようです。誰かが私がどこで間違っているのか見ることができますか?

0 投票する
1 に答える
115 参照

c - 追加情報パラメーターを含む Linux シグナル

sa_sigaction ハンドラーへのコールバックに追加情報が必要でしたが、それは不可能のようです。

そこで、代替案を教えていただけないでしょうか。基本要件:

  1. 関数 A は、構造体へのポインターを使用してシグナル/イベントを発生させます
  2. ハンドラー関数はイベントに取り組みます。
  3. ハンドラー関数はイベントでのみ呼び出され、 select() のようにイベントを待機するループは望ましくありません。