저는 포크폭탄을 가지고 놀다가 프로세스를 반복적으로 분기(fork)하면 초기 프로세스를 종료하면 전체 트리가 충돌하게 된다는 것을 알아냈습니다. BASH의 백그라운드 연산자 &를 사용하여 작성된 포크폭탄의 경우에는 해당되지 않으므로 이 문제를 해결할 수 있는 방법이 있다는 것을 알고 있습니다. C에서 어떻게 동일한 결과를 얻을 수 있습니까?
저는 Wikipedia의 포크폭탄(forkbomb) 예제를 사용해왔습니다:http://en.wikipedia.org/wiki/Fork_bomb#Example_fork_bombs
답변1
setsid(2)
C에서 이 작업을 수행하는 경우 코드에서 a와 일부 fork()
및 호출을 수행 해야 합니다 exit()
. setsid()
다음과 같은 효과가 있습니다.
...호출 프로세스가 프로세스 그룹 리더가 아닌 경우 새 세션을 생성합니다. 호출 프로세스는 새 세션 리더이자 새 프로세스 그룹의 프로세스 그룹 리더이며 제어 tty가 없습니다.
이것은 매뉴얼 페이지에서 가져온 것입니다. 기본적으로 프로세스 그룹의 리더인 프로세스가 신호를 받으면 해당 프로세스 그룹의 모든 프로세스 ID는 해당 신호를 받습니다. 매뉴얼 페이지에서 이 메커니즘을 볼 수 있습니다 kill(2)
. 음수 PID 로 호출하면 kill()
프로세스 그룹의 모든 프로세스에 신호가 전송됩니다.
fork()
exit()
당신은 또한 올바른 장소에 있어야합니다 . 기본적으로 살펴보세요데몬이 되는 방법에 대한 지침. 당신이 해야 할 일:
switch (fork()) {
case -1: return -1;
case 0: break;
default: _exit(EXIT_SUCCESS);
}
setsid();
switch (fork()) {
case -1: return -1;
case 0: break;
default: _exit(EXIT_SUCCESS);
}
이 코드의 근거에 대해 자세히 알아보려면 데몬 되기에 대해 읽어보세요.
답변2
프로세스를 백그라운드로 설정하고 계속 실행하는 방법에는 두 가지가 있습니다. 명령이 시작된 후 백그라운드에서 실행 중인 경우 &
이 명령을 사용하여 터미널에서 연결을 끊을 수 있습니다.
$ disown -a
중단 신호(HUP)에서 프로세스를 격리하고 터미널(tty)에서 연결을 끊으려면 다음 명령을 사용할 수도 있습니다.
$ nohup <cmd>
모든 콘솔 출력은 파일에 기록됩니다 nohup.out
.
따라서 disown -a
명령을 사용하여 프로세스를 백그라운드에 놓은 후 현명한 작업을 수행하는 것이 좋습니다.
다른 아이디어가 필요하면 다음 U&L 질문에 대한 답변을 확인하세요.포크 폭탄의 포크()는 어디에 있습니까:(){ :|: & };:?.
씨
나는 SO에서 다음과 같은 제목의 이 게시물을 살펴보겠습니다.C: Exec/fork > 실패한 프로세스, 구체적으로 대답은@길스.