問題タブ [sigchld]
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 - Windows の SIGCHLD の置き換え
Windows で SIGCHLD 機能を使用したいと考えています (つまり、子プロセスが終了したときに親プロセスに通知します)。Windows API に SIGCHLD に相当するものがないことは承知していますが、これを Windows で実装するための一般的な方法を教えてください。これは、Windows 開発者がかなり頻繁に遭遇する問題だと確信しています。
私が今考えている唯一の解決策は、子供たちをポーリングして、彼らがまだ生きているかどうかを確認することです.
注: 私のアプリケーションはシングル スレッドであり、可能であればそれを維持したいと考えています。アプリケーションには非ブロッキング イベント ループがあります (select() を使用)。
bash - CHLD信号のトラップ-ZSHは機能しますが、ksh / bash / shは機能しませんか?
これは、シェルスクリプトがバックグラウンドでいくつかのジョブを起動し、CHLD信号を受信すると(つまり、子プロセスの終了)、いくつかのアクションを実行するサンプルコードです...問題は、親シェルスクリプトがZSHスクリプトである場合、それはうまく機能し、CHLD信号をトラップしますが、他のシェルはそうではありません!何故ですか?
c - SIGCHLD シグナル処理
Unix では、バックグラウンドの子プロセスが終了すると、SIGCHLD
終了したことを知らせるシグナルを親プロセスに送信します。
プロセスがフォアグラウンドにあった場合でも同じことが起こりますか? もしそうなら、これは親がそれを無視することを意味します。
これは正しいですか?または、フォアグラウンドにある場合、信号はまったく送信されませんか?
linux - 親プロセスでの execl()-ing: SIGCHLD が ps によってキャッチされました
(子) プロセスのゾンビ状態を表示する必要がある fork()、exec() および関連する UNIX 呼び出しで割り当てを行っています。関連するコードは次のとおりです。
私が期待するものは次のとおりです。
私が得るものは次のとおりです。
ただし、呼び出しsleep(int time)
の前に (秒単位の整数時間) が挿入されるexecl
と、目的の出力が得られ、Signal エラーは報告されません。
ここで何が起こっているのですか?ps
(まだゾンビの)子供の新しい親になりますか?ps
また、コマンドが実行されないのはなぜですか? 必要に応じて実行するには何が必要ですsleep()
か?ps
私は POSIX/Linux プログラミングが初めてなのでSIGCHLD
、私の特定の状況に関するこのシグナルの関連性を評価していただければ幸いです。ありがとう!
perl - perl、「オープン」の子プロセスなし
こんにちは私はperlスクリプトが「子プロセスが見つかりません」を吐き出すというこの問題を抱えています...
私のスクリプトはいくつかの異なるタイプのフォークを呼び出すので、perldocのwaitpid()実装メソッドを実装して、forkとexec、systemとqwの両方のハンドルを使用できるようにしてみました。
コードの実行のこの部分に問題はありませんが、ファイルハンドルのCLOSEを閉じようとすると、「子プロセッサが見つかりません」というメッセージが表示されます。私はこの問題をもっと深く理解したいので、誰かが私にこれがなぜ起こっているのか説明できますか?OPEN呼び出しによってフォークされた子プロセスを取得して、クローズがファイルハンドルの処理方法を認識しないようにするのでしょうか。または多分私は100%オフです。任意の解決策をいただければ幸いです
bash - 特定の子プロセスが終了したときに、bash スクリプトで通知を受け取るにはどうすればよいですか?
誰かがこれを手伝ってくれるのだろうか?
私はbashスクリプトを持っています。別の GUI ベースのアプリケーションであるサブプロセスを開始します。次に、bash スクリプトはインタラクティブ モードになり、ユーザーからの入力を取得します。この対話モードは無期限に続きます。サブプロセスの gui アプリケーションが終了したときに終了させたいと思います。
SIGCHLD を見てきましたが、これは答えではないようです。これが私が試したことですが、プログラムが終了したときに信号が届きません。
次の回答を更新しました。「nosid」からの提案を使用して、これが機能するようになりました。関連するもう 1 つの問題があります。これは、次のインタラクティブなプロセスが、ユーザーからのキー入力の待機をブロックする基本的なメニュー駆動型のプロセスであるということです。子プロセスが終了すると、入力が受信されるまで USR1 シグナルは処理されません。シグナルを強制的にすぐに処理する方法はありますか?
待機の様子は次のようになります。
ソリューションで更新されました。私はこれを解決しました。その秘訣は、読み取りにノンブロッキング I/O を使用することでした。今、「nosid」からの回答と私の修正により、私はまさに私が望むものを手に入れました。完全を期すために、これが私にとってうまくいくものです:
c - SIGCHLD によるスリープ
一部のハードウェア センサーを 1 分に 1 回ポーリングし、読み取り値をデータベースに追加する C プログラムがあります。読み取り値が (分単位 + オーバーヘッド時間ではなく) 分単位に近づくようにするために、プログラムは実際の作業を行う子を作成し、別の子を作成する前に 60 秒間スリープします。
私が抱えている問題は、子からの SIGCHLD がスリープ (60) を中断し、1 分ごとに 1 つではなく、無制限の子が作成されることです。
これは私がそれをやろうとしてきた方法です:
select() を使用して、次のことを行うことで目的を達成できるとも聞きました。
しかし、何らかの理由で、これは while ループの 1 回の繰り返しでしか機能しません。その後、プログラムはまったく待機せず、常に子を作成します。
では、sigchld によって中断されることなく、プログラムにこれを実行させるにはどうすればよいでしょうか?
c - cのSIGCHLDハンドラー-不要な待機
SIGCHLDハンドラー関数で次の問題が発生しました。
ハンドラーコードは非常に単純です。
これは、子供を1人だけフォークする場合にうまく機能します。2つ(またはそれ以上)の子があり、そのうちの1つが実行を終了すると、sigchld_handler()が開始し、「ended = wait(NULL)」行に到達すると、プログラムはもう1つの子が終了するまで待機します。
別の方法で終了したばかりの子のPIDを取得し、この待機を回避する方法はありますか?
c++ - mount() および jffs2_gcd_mtd0 ガベージ コレクタ
MontaVista Linux 3.1 を実行しているプラットフォームで作業しています。
私は C++ アプリケーションを持っていますが、難解な理由により、JFFS2 フラッシュ ファイル システムを読み取り専用と読み取り/書き込みの間で定期的に再マウントする必要があります。
int mount(...)
で指定された呼び出しを実行してsys/mount.h
、ファイル システムを読み取り/書き込みに設定すると、jffs2_gcd_mtd0
ガベージ コレクター プロセスが期待どおりに開始されます。ただし、mount
呼び出しを繰り返して読み取り専用に戻すjffs2_gcd_mtd0
と、強制終了され、無効なプロセスになります。
数分後、jffs2_gcd_mtd0
何をしても取り除くことができない、大量の機能していないプロセスができあがります。
次のテスト アプリで問題を再現できます。
機能していないプロセスを取得するためにさまざまな方法を試しました:設定signal(SIGCHLD, SIG_IGN)
(機能しません); 読み取り専用に設定した後に呼び出しwait(int)
ます (失敗し、errno が 10 になり、「子プロセスがありません」)。呼び出しkill(0, SIGCHLD)
ます (機能しません)。
mount
これは私たちが持っている実装のバグであると仮定するのは正しいですか? これがバグであることを考えると、機能していないプロセスを削除し、プロセス ID テーブルがいっぱいになるのを防ぐにはどうすればよいでしょうか?
補足情報: でテスト アプリを実行すると、この問題は発生しないようですstrace
。今、私は本当に困惑しています!
python - SIGCHLDによって中断されないpythonselect
私は次のコードを持っています:
私のプログラムがこれを待っている間、シグナル(SIGCHLDなど)がある場合、selectはselect.errorで中断されます。ただし、select?に入る前に保留中のシグナルがある場合でも、これが機能するかどうかはわかりません。(connection_fdソケットはブロッキングに設定されています)。
保留中のシグナルがあるのにselectが中断されない可能性はありますか?