web-dev-qa-db-ja.com

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

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

例えば、

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

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

  • プロセスのdisownがプロセスの親プロセスを変更すると思ったのは、単にdisownという名前が意味するからです。しかし、それは真実ではないことがわかりました。

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

14
Tim

プロセスの親プロセス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で再接続すると、デーモンは以前と同じように多重化を続けます。デーモンは、すべてのサブプロセスが終了するか、強制終了されるか、致命的なバグが発生するか、ホストが再起動するまで実行され続けます。

14
Arcege