소스코드에서 다음 함수를 찾았습니다.고양이 눈(미니멀리스트 창 관리자):
void spawn(const Arg arg) {
if(fork() == 0) {
if(fork() == 0) {
if(dis)
close(ConnectionNumber(dis));
setsid();
execvp((char*)arg.com[0],(char**)arg.com);
}
exit(0);
}
}
왜 단순히 그렇지 않은지 이해가 안 돼요
void spawn(const Arg arg) {
if(fork() == 0) {
if(dis)
close(ConnectionNumber(dis));
setsid();
execvp((char*)arg.com[0],(char**)arg.com);
}
}
? 여기서 double을 사용하면 어떤 이점이 있습니까 fork()
?
답변1
다음 구절은 Stevens와 Rago의 글을 인용한 것입니다.UNIX 환경의 고급 프로그래밍, 데몬 작성을 위한 6가지 코딩 규칙 중 2가지를 설명합니다. 특히, 찾아보고 싶은 경우를 대비해 그림 13.1에 나열된 단일 함수 daemonize
로 이를 구현했습니다 .
- 포크를 호출하고 부모가 종료되도록 하세요. 여기에는 몇 가지 사항이 있습니다. 첫째, 데몬이 간단한 셸 명령으로 시작되면 상위 프로세스가 종료되도록 하면 셸이 명령이 완료된 것으로 생각하게 됩니다. 둘째, 자식 프로세스는 부모 프로세스의 프로세스 그룹 ID를 상속하지만 새로운 프로세스 ID를 얻으므로 자식 프로세스가 프로세스 그룹 리더가 아니라는 것을 보장할 수 있습니다. 이는 이후의 setid 호출을 위한 전제 조건입니다.
- 새로운 세션을 생성하려면 setid를 호출하세요. 섹션 9.5에 나열된 세 단계가 발생합니다. 프로세스는 (a) 새 세션의 리더가 되고, (b) 새 프로세스 그룹의 리더가 되며, (c) 제어 터미널에서 연결이 해제됩니다.
- System V 기반 시스템에서 어떤 사람들은 이 시점에서 다시 fork를 호출하여 상위 프로세스를 종료하고 하위 프로세스에서 데몬을 계속 실행하는 것을 권장합니다. 이렇게 하면 데몬이 세션 리더가 아니므로 System V 규칙(9.6절)에 따라 제어 터미널을 얻지 못하게 됩니다.또는 제어 터미널을 가져오는 것을 방지하려면 터미널 장치를 열 때 O_NOCTTY를 지정해야 합니다.
변경한 코드에서 상위 코드는 exit()
호출 이후에 계속 실행됩니다. spawn()
정확한 동작은 spawn()
호출 이후의 내용에 따라 달라집니다.