問題タブ [eintr]
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 - 単体テストのエラー条件 - EINTR
つまり、システム コールで EINTR などのエラー状態をどのように単体テストしますか。
私が取り組んでいる特定の例の 1 つは、(errno==EINTR) で EOF を返すときに fclose を再度呼び出す必要があるかどうかです。動作は、fclose の実装によって異なります。
EINTR が発生したときに fp が解放された場合、この呼び出しは安全ではない可能性があります。when (errno==EINTR) のエラー処理をテストするにはどうすればよいですか?
sockets - マルチスレッド アプリケーションでのソケット読み取りがゼロ バイトまたは EINTR (104) を返す
しばらくの間、C コーダーをしています - 初心者でも専門家でもありません。今、私は PPC Linux 上の C で特定のデーモン化されたアプリケーションを持っています。PHP の socket_connect をクライアントとして使用して、このサービスにローカルで接続します。サーバーは、Unix ソケット経由で接続を多重化するために epoll を使用します。ユーザーが送信した文字列は、strstr() を使用して特定の文字/単語について解析され、見つかった場合は、4 つの結合可能なスレッドを異なる Web サイトに同時に生成します。ソケット、接続、書き込み、読み取りを使用して、各スレッドのポート 80 で TCP 経由で前述の Web サーバーと対話します。すべての接続と書き込みは成功したようです。ただし、Web サーバー ソケットへの読み取りは失敗します。(A) 3 つのスレッドすべてがハングしたように見え、1 つのスレッドだけが -1 を返し、errno が 104 に設定されます。応答するスレッドには 10 分ほどかかります。 104(EINTRですか?)、これは、ネットワーク コンテキストでは、「接続がピアによってリセットされた」ことを示唆しています。または (B) 3 つのスレッドから 0 バイトで、4 つのスレッドのうち 1 つだけが実際にデータを返します。ソケットは読み取り/書き込みスレッドセーフではありませんか? 私は、strtok_r、gethostbyname_r などのスレッドセーフ (および再入可能) libc 関数を使用しています。
*シングルスレッドのスタンドアロン(他のすべてが等しい)を実行すると、すべてが完全に正しく機能しますが、もちろん直列では並列ではないため、上記のWebホストが実際に接続をリセットしているとは思えません。
2 番目の問題もあります (おっと)、epoll された Unix ソケットに接続しているクライアントに書き戻すことができません。デーモン アプリケーションがハングし、CPU を 100% 以上占有します。それでも、クライアント側には何も書き込まれません。これが発生するたびに、クライアント(非常に典型的なPHPソケットアプリケーション)が接続を閉じていないことを確認してください-エラーも検出されませんでした。何か案は?
Valgrind、GDB、または多くのロギングを使用しても、何が問題なのかわかりません。親切にできるところを手伝ってください。
c++ - EINTRの処理(gotoで?)
背景:これは、 C ++(Linux / GCC)でのシステムコールのEINTRの処理に関するこのスレッドのフォローアップ質問です。アプリケーションのプロファイルを作成するかどうかに関係なく、システムコールの設定errno
をEINTR
特別な場合として処理する必要があるようです。の使用については、多くの、多くの、多くのgoto
意見があります。
私の質問:システムコールは、名目上のものと見なされる場合に設定errno
されていますか?そうでない場合は、次のコードを処理するように変換することをどのように提案しますか?EINTR
goto
EINTR
前もって感謝します!
乾杯、-
クリス
更新:以下の回答に基づいて、私は次のマクロを作成することになりました。
これは、元のスニペットを次の例に変換するために使用されます。
これが他の誰かに役立つことを願っています!
linux - EINTR をチェックして関数呼び出しを繰り返すのはいつですか?
組み込み Linux システム用のユーザー アプリケーションをプログラミングしており、デバイスに対して open、close、read、ioctl などの一般的な関数を使用しています。今、私は EINTR について読んで、関数がシグナルによって中断されたことを示していますが、その意味についてはわかりません。私が持っているすべてのサンプルプログラムでは、ioctl() のように実行されることもあれば、read() のように実行されないこともあります。だから、私は少し混乱しています。
EINTR を確認して関数呼び出しを繰り返すのが望ましいのはいつですか?
python - Linux での Python の選択と EINTR の処理に関する回避策はありますか?
私の最近のプロジェクトの 1 つで、たまたま同じプロセス (Python プログラム、そのマルチスレッド アプリケーション) を使用していました。
AVT PvAPI SDKにリンクされたライブラリへの Boost::Python モジュール、つまり最も広い意味でカメラから画像フレームを取得するためのドライバー。このライブラリ (PvApi SDK) は、数ミリ秒ごとにSIGALRMを内部的に生成します。
pyserialを使用してシリアル I/O を実行することを目的とした別のプレーンな Python モジュール。これは、Python のラッパーselect.selectを POSIX selectに使用します。
errno == EINTR
これは、信号が他のモジュールによって生成されるたびに中断されることが判明しました ( )。Python のtime.sleep、resp の呼び出しでも同じ問題が発生する可能性があります。内部で使用されるPOSIX sleep 。
これらの問題は明らかに Windows には存在しません。(ドキュメンテーションによると) スリープと選択はシグナルによって中断されないためです。これらの問題は、C/C++ ではそれほど問題ではありません。呼び出しが中断された場合は、呼び出しを再開することができます (ただし、再開する必要があります)。
ただし、Python の実装 (ソース コード/Modules/selectmodule.c) はこのケース ( ) を処理しないEINTR
ため、Python で使用するために独自の C/C++ シリアル ドライバーとスリープ機能を実装する必要がありますか? それとも、このプロジェクトのために Python から離れますか? Python はプログラミングを非常に簡単にするので、誰かが同様の問題を抱えていて、これに対する優れた回避策または簡単な修正を見つけた場合、私は非常に興味があります. 現時点では、Python モジュールに必要な修正を自分で行う能力がありません。それとも、他のオプションを見逃したのでしょうか?
何か案は?
posix - TEMP_FAILURE_RETRY とノンブロッキング ソケット
TEMP_FAILURE_RETRY
非ブロッキングソケットでライブラリ呼び出し (失敗して errno を EINTR に設定する可能性がある) を囲むために使用する必要がありますか?
python - Python: math および os モジュールの関数が EINTR によって中断される
samsung SoC s3c6410 (ARM11) に Linux ボードがあります。buildroot: Python 2.7.1, uClibc-0.9.31 で rootfs をビルドします。Linux カーネル: Linux buildroot 2.6.28.6 #177 Mon Oct 3 12:50:57 EEST 2011 armv6l GNU/Linux
Pythonで書かれた私のアプリは、いくつかの謎の条件でこの例外を発生させます:
1) 例外:
コード:
2) 例外:
コード:
アプリに関する情報: 3 ~ 7 のスレッドがあり、「シリアル」モジュールを介してシリアル ポートをリッスンし、directfb をラップする c 拡張機能を介して実装された gui を使用します。この例外は再現できません。それらは予測できません。
私はPythonでEINTR例外を探しましたが、EINTRは遅いシステムコールでのみ発生し、Pythonのモジュールソケット、サブプロセス、および別のモジュールはすでにプロセスEINTRであることがわかりました。では、私のアプリでは何が起こるでしょうか? 数学関数の単純な呼び出しがいつでもプログラムを中断できるのはなぜですか。まったく信頼できません。提案があるのは、ulibc のバグ、kernel/hw 処理のバグです。しかし、この提案は解決策を示していません。
今、os モジュールのいくつかの関数の周りにラップ関数 (EINTR の場合に操作を再開する) を作成しましたが、数学モジュールをラップすると実行時間が 2 倍になります。別の質問があります: 数学が他のモジュールよりも中断できる場合、信頼性を得るにはどうすればよいですか?
PS ライブラリ呼び出し (たとえば libm への呼び出し) はシステム コールではないことに気付きました。
signals - ブロッキング関数と EINTR
多くの POSIX ブロッキング関数は、シグナルの場合に EINTR を返します。アイデアは、シグナルハンドラーが最初にフラグを設定し(SIGINTの場合は「停止」フラグと言う)、次にブロッキング関数がEINTRを返すブロックを解除し、アプリケーションがフラグを見て、正常なシャットダウン(または何でも)を実行することです。
ただし、pthread_mutex_lock や pthread_cond_wait などの一部のブロッキング関数では EINTR エラーは発生しません。
その背後にあるアイデアは何ですか?これらの機能を使用するアプリケーションは、シグナルをどのように処理することになっていますか (具体的には Ctrl+C)?
c++ - シグナルによって中断されたシステムコールはまだ完了する必要があります
のような多くのシステムコールはclose( fd )
、シグナルによって中断される可能性があります。この場合、通常-1
は が返され、errno
設定されEINTR
ます。
問題は、何をするのが正しいかということです。言ってください、私はまだこれfd
を閉じたいと思っています。
私が思いつくことができるのは:
この状況を処理するためのより良い/よりエレガントな/標準的な方法を提案できる人はいますか?
更新: mux が気づいたRESTART
ように、シグナル ハンドラをインストールするときに SA_ フラグを使用できます。POSIX
だけでなく、すべてのシステムで再起動可能であることが保証されている機能を誰か教えてもらえますLinux
か?
nonblocking - EINTR と非ブロッキング呼び出し
知られているように、いくつかのブロッキング呼び出しは と のようread
にwrite
-1 を返し、 に設定さerrno
れEINTR
、これを処理する必要があります。
私の質問は次のとおりです。これは非ブロッキング呼び出しに適用されますか。たとえば、socket を に設定しますO_NONBLOCK
か?
私が読んだいくつかの記事やソースでは、非ブロッキング呼び出しはこれを気にする必要はないと述べていますが、それについての信頼できる参照は見つかりませんでした。もしそうなら、それは異なる実装間で適用されますか?