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가 앱을 종료하지 않는 이유를 설명 할 수 있습니까?