プロセスの親プロセスを変更することは可能ですか?はいの場合、どのように?
例えば、
screen
はどのようにしてscreen
セッションとその内部で実行されているプロセスを別のシェルプロセスにアタッチするのですか?親プロセスの変更はありますか?
プログラムが実行されているシェルプロセスの他の変更方法を聞いたようですが、覚えていません。プログラムの親プロセスの変更もありますか?
プロセスのdisown
がプロセスの親プロセスを変更すると思ったのは、単にdisown
という名前が意味するからです。しかし、それは真実ではないことがわかりました。
Emacsクライアントは別の端末タブでemacsサーバーに接続できます。親プロセスの変更はありますか?
プロセスの親プロセスID(ppid)は、カーネル外では変更できません。 setppidシステムコールはありません。プロセスの親が終了したというシグナルにプロセスが応答しなかった場合、カーネルはプロセスの親が終了した後でのみ、ppidを(pid)1に変更します。これが発生するためには、プロセスは事前にさまざまなシグナル(SIGHUP
、SIGTERM
など)を無視する必要があります。
screen(1)
には、デタッチと再アタッチを処理する非常にエレガントな手段があります。 screen
を初めて起動すると、実際にはユーザーインターフェイス(ui)が起動されます。これにより、デフォルトでデーモン(セッションマネージャー)が作成されます。このデーモンには端末が関連付けられていません。新しいプロセスグループ(setpgrp(2)
)、新しいセッションID(setsid(2)
)があります。デーモンは、SCREEN
として実行され、疑似端末(pty
)に接続されたサブプロセスを作成し、ptyとui(screen
)からのデータを多重化します。サブプロセスは、実際の端末と通信していると考えます。
Ui screen
が終了しても、デーモンSCREEN
は実行され、データのバッファリング、シグナルの処理、新しいUIの待機などを行います。これは、それが別のプロセスグループであり、独自のセッションにあるためです。 。新しいui screen
で再接続すると、デーモンは以前と同じように多重化を続けます。デーモンは、すべてのサブプロセスが終了するか、強制終了されるか、致命的なバグが発生するか、ホストが再起動するまで実行され続けます。