2013-03-05 3 views
1

Linux 프로세스 그룹 및 세션에 대해 읽고 있습니다. this site에서 나는 참조 : 로그 아웃 할 때 왜 내 데몬이 종료되지 않습니까?

시스템의 아웃 사용자가 로그인, 커널이 작업을 단순화하기 위해 ... 사용자가 실행 한 모든 프로세스를 종료 할 필요가

는, 프로세스 세션의 세트로 구성되어 있습니다. 세션의 ID는 setsid() 시스템 호출을 통해 세션을 만든 프로세스의 PID와 같습니다. 이 프로세스를 해당 세션 그룹의 세션 리더라고합니다. 그 프로세스의 자손은 모두 자신으로부터 특별히 제거하지 않는 한 해당 세션의 멤버입니다. setsid() 함수는 인수를 취하지 않고 새 세션 ID를 반환합니다.

OS가 사용자의 세션을 종료하기로 결정할 때 기사가 말하지 않는 내용이 있습니다. 초기 가정은 누군가가 TTY에 로그인 할 때 TTY가 세션 리더이고 해당 세션에서 호출 된 모든 프로세스가 setsid()을 호출하지 않으면 세션에 속한 것입니다. 그러나 이것은 가장 간단한 예제에 의해 검증 된 것처럼 분명히 잘못되었습니다.

코드에서
#include 
#include 
#include 
#include 

int main(void) { 

    pid_t pid = fork(); 

    if(pid < 0) { 
    perror("fork"); 
    exit(EXIT_FAILURE); 
    } 

    if(pid == 0) { 
    FILE * heartbeat_file = fopen("daemon.out", "w"); 
    int hb = 0; 
    while(1) { 
     fprintf(heartbeat_file, "%d\n", hb); 
     fflush(heartbeat_file); 
     hb++; 
     sleep(1); 
    } 
    } 
    exit(EXIT_SUCCESS); 
} 

, 우리는 아이가 지속적으로 파일에 기록 것을보고, 부모 (나는 그것이 실제 데몬하지 알고 있지만, 포크를 않습니다) ...이 "디먼에"고려 종료. 나는 결코 setsid()이라고 전화하지 않는다는 것을주의하십시오.

로그인하고 데몬을 실행 한 다음 로그 아웃 한 다음 로그인하면 데몬이 여전히 실행 중입니다! fork()으로 전화를 제거 할 수 있으며 예상대로 로그 아웃하면 프로세스가 종료됩니다. 내가 로그 아웃 할 때 fork가 앱을 종료하지 않는 이유를 설명 할 수 있습니까?

답변

1

부모가 종료되는 동안 포크 할 때 고아 프로세스 (http://en.wikipedia.org/wiki/Orphan_process)를 만듭니다. 이러한 고아는 프로세스로 다시 보급됩니다. 내가 다시 부모가 세션 ID를 수정한다는 것을 관찰 한 것으로 가정합니다.

이 가정을 테스트하는 간단한 방법은 부모가 자식을 기다리는 것입니다 (죄송합니다. 지금은 내 리눅스 상자에 있지 않아서 할 수 없습니다).

관련 문제