Linux에서 애플리케이션을 두 번 클릭하면 누가 포크합니까?

Linux에서 애플리케이션을 두 번 클릭하면 누가 포크합니까?

그래서 나는 쉘에 있을 때 실행 파일을 실행한 다음 쉘이 이를 하위 프로세스로 포크하고 나중에 실행 파일의 프로그램과 데이터 메모리를 얻기 위해 실행 파일을 포크하는 것을 알고 있습니다. 따라서 내 쉘이 이제 닫히거나 종료되면 관련된 모든 하위 프로세스도 종료됩니다.

나는 리눅스에서 모든 프로세스가 fork() exec()를 통해 생성된다는 것을 읽었습니다. 궁금하고 응용 프로그램이 아이콘을 두 번 클릭하여 시작될 때마다 궁금합니다. 이 프로세스는 fork() exec()를 처리합니다. 일부 OS 프로세스라는 것을 알고 있습니다.

감사합니다!

답변 /sbin/upstart로 추적했습니다.

답변1

우선은 좀술어.

실행 파일은 시스템에 있는 간단한 파일입니다. 프로세스는 간단히 말해서 실행 파일에 포함된 프로그램을 실행하는 것입니다.


당신 말이 맞아요실행 파일이 시작되는 방식:

  1. 부모 프로세스(이미 살아 있음)forks 자체가 해당 지점에서 두 개의 실행 흐름을 주도합니다. 하나는 부모 프로세스에 살고 있고 다른 하나는 새로운 새로운 프로세스에 살고 있습니다.
  2. 새(자식) 프로세스는 실행할 실행 파일의 프로그램을 실행하기 위해 자신을 음소거합니다. 이는 다음을 사용하여 수행됩니다.시스템콜~의exec가족.

실행 가능 아이콘을 두 번 클릭하는 그래픽 인터페이스의 예를 들면 기본적으로 다음 소스 코드를 사용하여 클릭한 아이콘을 표시하는 프로세스에서 실행 파일이 분기됩니다.

const char *exe_path = taken_from_icon();
int pid = fork();
if(pid == 0)
{
    // I am the new child
    execl(exe_path, exe_path, NULL);
    // exec only return in case of failure
    exit(EXIT_FAILURE);
}
// I am the graphical interface,
// Continue and wait for another clic

하지만죽음과 부모됨그 아이의 상태는 당신이 말한 것과 꼭 같지 않습니다.

기본적으로 상위 프로세스가 아직 살아 있을 때 하위 프로세스는 아버지의 하위 프로세스입니다(예!-). PPID(상위 프로세스 ID)는 이를 분기한 아직 살아 있는 프로세스로 설정되어 있습니다.

상위 프로세스가 종료되면 상황이 변경됩니다. 하위 프로세스는 계속 작동하지만 해당 PPID는 아직 작동 중인 gran-parent 프로세스로 설정됩니다. 프로세스는 결코 죽지 않기 때문에 항상 하나가 있습니다 init.


쉘 자체가 죽을 때 쉘 자식도 죽는다는 사실은 특정한 것입니다. 그 이유는 두 가지입니다.

  • 첫 번째: 쉘은 일반적으로 포크한 PID 목록을 유지합니다. 그리고 쉘이 죽으면 모두 죽습니다. 주요 쉘에는 disown이 목록에서 하위 항목을 제거하고 쉘이 종료될 때 이를 활성화시키는 명령이 내장되어 있습니다. 보다배쉬 매뉴얼 페이지:

    SIGHUP을 수신하면 기본적으로 셸이 종료됩니다. 종료하기 전에 대화형 셸은 실행 중이거나 중지된 모든 작업에 SIGHUP을 다시 보냅니다. 중지된 작업은 SIGHUP을 수신하는지 확인하기 위해 SIGCONT로 전송됩니다. 쉘이 특정 작업에 신호를 보내는 것을 방지하려면 disown 내장 기능을 사용하여 작업 테이블에서 해당 작업을 제거하거나(아래 SHELL BUILTIN 명령 참조) disown -h를 사용하여 SIGHUP을 수신하지 않도록 표시해야 합니다.

  • 두 번째: 쉘 자식은 일반적으로 stdin, stdout 및 stderr을 파이프를 통해 쉘 자체에 연결합니다. 쉘이 하위 stdout 사용을 중지하거나(종종 인쇄하기 위해) 파이프 끝을 닫으면 하위가 stdout에 쓸 때 오류가 발생하여 차단되거나 종료될 수 있습니다.

관련 정보