프로세스의 부모 프로세스를 변경 하시겠습니까?


14

프로세스의 상위 프로세스를 변경할 수 있습니까? 그렇다면 어떻게?

예를 들어

  • 어떻게 screen연결하는 관리 screen세션과 다른 쉘 프로세스에 내부에서 실행중인 프로세스를? 부모 프로세스의 변경이 있습니까?

  • 프로그램이 실행중인 쉘 프로세스의 다른 변경 방법에 대해 들었지만 기억이 없습니다. 프로그램의 부모 프로세스도 변경 되었습니까?

  • disown프로세스가 프로세스의 상위 프로세스를 변경 한다고 생각했는데 이름이 disown암시 하기 때문 입니다. 그러나 나는 그것이 사실이 아니라는 것을 알았습니다.

  • Emacs 클라이언트는 다른 터미널 탭에서 emacs 서버에 연결할 수 있습니다. 부모 프로세스의 변경이 있습니까?


disown쉘의 자식 프로세스 목록에서 주어진 자식을 제거합니다. 아이의 PPID는 쉘의 PPID로 유지됩니다. 쉘은 그 자식을 시작한 것을 잊어 버렸지 만 커널은 기억합니다.
워렌 영

프로세스가 부모를 기억합니까?
Tim

알고 싶다면, getppid(2)시스템 호출 및 시스템 호출이 커널에 의해 처리됩니다. 호출을 실행하고 값을 저장 한 다음 상위 항목이 변경된 후 해당 값을 사용하여 프로그램을 혼동 할 수 있습니다. 여기에 경쟁 조건이있을 수 있습니다.
워렌 영

흥미로운 새로운 커널 기능인 것 같습니다.
ChuckCottrill

답변:


14

프로세스의 상위 프로세스 ID (ppid)는 커널 외부에서 변경할 수 없습니다. 설정된 시스템 호출이 없습니다. 프로세스가 부모가 종료되었다는 신호에 응답하지 않으면 커널은 프로세스 부모가 종료 된 후에 만 ​​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하면 데몬은 이전처럼 계속 멀티플렉싱됩니다. 데몬은 모든 하위 프로세스가 종료되거나 종료되거나 치명적인 버그가 발생하거나 호스트가 재부팅 될 때까지 계속 실행됩니다.


감사. "Emacs 클라이언트는 다른 터미널 탭에서 emacs 서버에 연결할 수 있습니다. 상위 프로세스가 변경 되었습니까?"
Tim

1
모든 프로세스에는 부모가 죽거나 죽을 때까지 부모가 하나만 있습니다. 그것이 죽으면 요점은 약하다. 부모가 사망하면 PPID는 1이 init됩니다. 이것은 부모 프로세스가 종료 될 때 부모 프로세스가 변경되는 유일한 시간입니다. 프로세스 간 통신 (파이프, 소켓 등)을 통한 연결은 PPID에 영향을 미치지 않습니다.
Arcege

Emacs는 어떻게 다른 터미널 탭에서 서버에 클라이언트를 연결합니까?
Tim

서버는 연결을 기다리는 소켓 (일반적으로 UNIX 도메인 소켓 파일)을 수신합니다. 클라이언트는 해당 소켓에서 연결을 엽니 다. 탭은 클라이언트와 서버 간의 통신과 관련이 없으며 다른 탭, 다른 teminal 에뮬레이션 (xterm vs rxvt vs 터미널) 또는 xemacs 일 수 있습니다. 각 클라이언트는 어디에서 연결해야하는지 알고 있습니다.
Arcege

1
부모 프로세스 ID가 항상 1
JdeBP

-2

이해 했어요. 커널을 변경하여 일부 모듈을 작성해야합니다! 나는 그것이 어떤 경우에는 유용 ​​할 것이라고 생각합니다. 예를 들어 오랜 시간 동안 많은 노력을 기울이면 한 시간 동안 많은 자원이 필요합니다. (이 경우 평소와 같이) 시스템이 응답하지 않으면 예기치 않은 조치를 수행합니다 (수행해야하며 클릭을 확신하지 못하기 때문에) 올바른 장소에 마우스를 놓아 시스템이 오랫동안 응답하지 않음) 실수로 상위 프로세스를 종료하십시오. 시스템은 보통 모든 어린이를 죽입니다! 그러나 자식 프로세스가 루트 및 부모 전용 서수 사용자 및 작업 인 경우 서수 사용자도 수행하면이 프로세스는 어떤 경우에도 종료되지 않습니다! 그리고 그의 부모는 PID 1로 초기화됩니다. 그리고 마지막으로 시스템이 응답하면 계층 구조를 복원하려고합니다. 그러나 당신은 할 수 없습니다! 표준 su를 사용하여 일반 사용자로 터미널에서 루트로 업그레이드 시스템을 시작하십시오. 왜? 콘솔에서 모든 실수와 경고를 받으십시오. 특히 업그레이드 유틸리티는 GUI입니다. 그들은이 정보를 아무것도 얻지 못합니다 ... Windows OS에서는 이것이 가능하다는 것을 기억합니다. 특별한 WinAPI 기능이 있습니다. 리눅스에서 왜 이것을 할 수 없습니까? 명확하지 않습니다 ... 간단한 것입니다 !!!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.