プロセスの親プロセスを変更しますか?


14

プロセスの親プロセスを変更することは可能ですか?はいの場合、どのように?

例えば、

  • セッションとその中で実行されているプロセスを異なるシェルプロセスにどのようscreenにアタッチするのscreenですか?親プロセスに変更はありますか?

  • プログラムが実行されているシェルプロセスを変更する他の方法を聞いたようですが、覚えていません。プログラムの親プロセスの変更もありますか?

  • disown名前disownがそれを暗示しているという理由だけで、プロセスがプロセスの親プロセスを変更すると考えました。しかし、私はそれが真実ではないことがわかりました。

  • Emacsクライアントは、異なる端末タブでemacsサーバーに接続できます。親プロセスに変更はありますか?


disownシェルの内部プロセスの子プロセスから特定の子を削除するだけです。子のPPIDはシェルのPPIDのままです。シェルは、その子を起動したことを忘れていましたが、カーネルは記憶しています。
ウォーレンヤング

プロセスはその親を覚えていますか?
ティム

知りたい場合getppid(2)は、システムコールを呼び出し、システムコールはカーネルによって処理されます。プログラムは、その呼び出しを発行し、値を保存し、親子関係が変更された後にその値を使用することで混乱する可能性があります。ここで競合状態になる可能性があります。
ウォーレンヤング

興味深い新しいカーネル機能のように聞こえます。
ChuckCottrill

回答:


14

プロセスの親プロセスID(ppid)は、カーネル外では変更できません。setppidシステムコールはありません。カーネルは、プロセスの親が終了した後、プロセスが親が終了したというシグナルに応答しなかった場合にのみ、ppidを(pid)1に変更します。これを実現するために、プロセスは、様々な信号(無視されている必要がありSIGHUPSIGTERM予め、等)。

screen(1)は、デタッチおよび再アタッチを処理する非常にエレガントな手段を備えています。を初めて起動するとscreen、実際にはユーザーインターフェイス(ui)が起動します。これはデフォルトでデーモン(セッションマネージャー)を作成します。このデーモンには、関連する端末、新しいプロセスグループ(setpgrp(2))、新しいセッションID(setsid(2))がありません。として実行されているデーモンは、SCREEN擬似端末に接続されたサブプロセスを作成し(pty)、次にptyとuiからのデータを多重化します(screen)。サブプロセスは、実際の端末と通信していると考えます。

uiがscreen終了しても、デーモンSCREENは別のプロセスグループであり、独自のセッションであるため、データのバッファリング、信号の処理、新しいuiの待機などを実行し続けます。新しいui screenで再接続すると、デーモンは以前と同じように多重化を続けます。デーモンは、すべてのサブプロセスが終了するか、強制終了されるか、致命的なバグが発生するか、ホストが再起動するまで実行を続けます。


ありがとう。「Emacsクライアントは別の端末タブでemacsサーバーに接続できます。親プロセスに変更はありますか?」を追加しました。
ティム

1
親が死ぬか死ぬまで、すべてのプロセスには1つの親しかありません。それが死んだ場合、ポイントは論争です。親が死ぬと、PPIDは1、initプロセスになります。これは、親プロセスが終了するときに、親プロセスが変更される唯一の時間です。プロセス間通信(パイプ、ソケットなど)を介して接続しても、PPIDには影響しません。
アルケージュ

Emacsはどのように異なる端末タブでクライアントをサーバーに接続しますか?
ティム

サーバーは、接続を待機するソケット(通常はUNIXドメインソケットファイル)でリッスンします。クライアントはそのソケットで接続を開きます。タブは、クライアントとサーバー間の通信には無関係です。異なるタブ、異なる端末エミュレーション(xterm vs rxvt vs端末)、またはxemacsである可能性があります。各クライアントは接続先を知っているため、どこからでも接続できます。
アルケージュ

1
親プロセスIDは常に1になるわけではありません。 この受け取った知恵の絶対主義は、現在3年以上間違っています。
JdeBP

-2

わかります。そのためには、カーネルを変更してモジュールを作成する必要があります!場合によっては役に立つと思います。たとえば、1時間で多くのリソースを消費する長い一生懸命の作業...そして、システムが応答しない場合(この場合は通常)、予測できないアクションを実行します(実行する必要があるため、クリックするかどうかわからないマウスが正しい場所にあるため、システムが長時間応答しなくなり、誤って親プロセスを強制終了します。システムは通常すべての子供を殺します!ただし、子プロセスがルートであり、親のみの順序ユーザーおよびアクションである場合、このプロセスはどのような場合でも強制終了されません!そして、彼の親はPID 1で初期化されます。そして最後にシステムが応答した後、階層を復元します。しかし、できません!!! 標準では、suを使用して、通常のユーザーとして端末からルートとしてアップグレードシステムを起動します。どうして?したがって、コンソールですべての間違いと警告を取得します。特に、アップグレードするユーティリティはGUIです。彼らはこの情報を何も得ません... Windows OSではこれができることを覚えています。特別なWinAPI関数があります。なぜLinuxではこれができないのですか?明確ではありません...その簡単なこと!!!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.