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