問題タブ [process-reaper]

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 投票する
2 に答える
341 参照

c - 親が子を殺すように合図されたときに、リーパー関数に追加のパラメーターを詰め込む方法(c)?

私はチャットルームのように機能するTCPサーバーを作成していて、この質問に出くわしました。

ユーザーが接続すると、ユーザーにサービスを提供するための子プロセスが作成されます。
ユーザーがログインすると、ユーザー名をテキストファイルに保存しますがonline.txt
、ユーザーがログアウトすると、online.txt(問題)からユーザーを削除する必要があります。次にsignals、親が子reaper()を殺します。

私の質問は次のとおりです。

Q1:リーパーに追加情報(ユーザーがログインに使用したユーザー名など)を絞り込んで、ユーザーをリーパーから削除する方法を教えてonline.txtください。それとも、そうするための別のより良い方法がありますか?

sigQ2: inはどこreaper()からその価値を得るのですか?刈り取り機にパラメータを追加できますか?

Q3:子のpidをlogin.txtのある種の主キーとして使用できますか?もしそうなら、どうすればreaper()親によって呼び出されるの間に子供のpidを取得できますか?

刈り取り機は次のようになります。

親が使用するシグナルは次のようになります。

よろしくお願いします。一度に3つの質問をするのはあまり貪欲ではないことを願っています。
質問のいずれかに関する洞察は大歓迎です。

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

unix - 再親子化のプロセス: 誰が新しい親になるかを制御する

新しい親は常に「init」ですか、それとも新しい親になる人を制御する方法はありますか?

ウィキペディアは、常に「init」であることを示しているようです。そうでないことを心から願っています。setpgid と setsid で考えられることはすべて試しましたが、うまくいきませんでした。そして、このウィキペディアの記事を見たので、アドバイスが必要です。

Unix ライクなオペレーティング システムでは、孤立したプロセスは、特別な init システム プロセスによってすぐに採用されます。この操作は親の再設定と呼ばれ、自動的に行われます。技術的には、プロセスの親として「init」プロセスがありますが、最初にそれを作成したプロセスが存在しないため、孤立プロセスと呼ばれます。 ウィキペディアから取得

私が質問している理由は、多数のワーカー プロセスを実行する Mac アプリを作成しているためです。これらのワーカー プロセスを、タスク マネージャーのプロセス階層のメイン プロセスの子として表示する必要があります。一部のワーカーは異なるユーザーとして実行され、Mac OS XI では子プロセスに特権を渡すために 2 回 fork する必要があります。現在デーモンとして実行されているワーカーを「ダブルフォーク」しているため、タスクマネージャーで見ると、ワーカーが親プロセスとして「init」を持っていることがわかります。

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

c - プロセスを採用することは可能ですか?

プロセス A はfork()プロセス B です。

プロセス A は終了し、したがってinitB を採用します。

ウォッチドッグはプロセス C を作成します。

CがBからBを採用することはどういうわけか可能initですか?


更新

initそれとも、B の中間の親になることなく、A が亡くなる前に C が作成された場合、C に B を直接 (A が亡くなったときに) 採用させることさえ可能でしょうか?


更新-1:

また、私が説明した方法でプロセスを採用する可能性が悪いこと、または実装が困難または不可能である理由について、コメントをいただければ幸いです。


Update-2 - ユース ケース (親と子はプロセスを参照):

親の管理機能に依存している多くの子を管理するために、親を使用するアプリがあります。その仕事をするために、親は子の終了によって通知されることに依存しています。これは、関連するSIGCHLDシグナルを受信することによって行われます。

親自体が何らかの事故 (segfault を含む) で死亡した場合、「家族」全体を再起動する必要があります。これは、子の終了時に何かをトリガーすることが不可能になっているためです (これも segfault が原因である可能性があります)。

このような場合、すべての子プロセスを停止して、システム全体を再起動する必要があります。

この状況を回避するための可能なアプローチは、死んだ親の役割を引き継ぐことができるスペアプロセスを用意することです... -ステップの子のSIGCHLDシグナルを再び受信できる場合!