프로세스의 상위 프로세스를 변경할 수 있습니까? 그렇다면 어떻게?
예를 들어,
세션과 그 안에서 실행되는 프로세스를 다른 셸 프로세스에 연결하려면 어떻게
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
데몬은 이전과 같이 계속해서 다중화를 수행합니다. 데몬은 모든 하위 프로세스가 종료되거나, 종료되거나, 치명적인 오류가 발생하거나, 호스트가 다시 시작될 때까지 계속 실행됩니다.