부모가 먼저 종료되어 버리면.. 자동으로 init가 부모가 되고..
좀비 프로세스가 되는걸로 알고 잇는데.. 질문 올리신 분의 의도는
좀비나 뭐 그런 상태가 되지 않고.. fork()된 자식도 완전히 별개의
프로세스가 되길 원하시는게 아닌가요?? 아닌강..^^;;
프로세스 기반에서는 자식을 제대로 종료시켜주지 않으면 제대로 죽지 않죠..
컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러
부모가 먼저 종료되어 버리면.. 자동으로 init가 부모가 되고..
좀비 프로세스가 되는걸로 알고 잇는데.. 질문 올리신 분의 의도는
좀비나 뭐 그런 상태가 되지 않고.. fork()된 자식도 완전히 별개의
프로세스가 되길 원하시는게 아닌가요?? 아닌강..^^;;
프로세스 기반에서는 자식을 제대로 종료시켜주지 않으면 제대로 죽지 않죠..
...
pid = fork ();
if (pid 가 root이면) exit (0);
pid = fork ();
if (pid 가 root이면) exit (0);
child가 실제 root가 되어서 deamon형태를 실행...
...
각 OS별로 fork시에 좀비나 defunt가 발생하지않도록 하는 방법이 있는데
제가 받은 소스가 HP에서 만든 OS(UNIX계열)였고 실제 구현은 DEC UNIX에서
했지만 위형태의 방법이 그대로 적용되더군요.
물론 fork를 한번만 사용하면 root에 대한 좀비가 발생을 했었던걸로 기억합니다.
따라서 두번의 fork로 완전하게 root가 누구였는지를 상실하게 했었죠.
음... 이유는 아직도 잘모르겠지만 그렇게 방법을 배워서 LINUX에서도 여러번
사용했었죠. 물론 LINUX에서도 동작은 잘했습니다.
다른 OS(UNIX)에서는 사용해보질 않았지만 특별히 문제가 되진 않을겁니다.
다른 서버소스를 잠시 살펴보아도 시작을 위와 같은 형태로 하는것들이 왕왕
있더군요.(제가 보았던 대부분의 데몬서버를이... :))
부모가 죽는다고 죽는것은 절대로 아닙니다. (만일 부모가 자기 죽을 때,
자식프로세스에게 죽으라는 signal을 인위적(프로그램으로 작성;또는 shell에서
kill ****)으로 보내지 않는한 죽을 일 없습니다.)
Seven.. wrote:
프로그램(A) 안에서 다른 프로그램(B)을 실행시키고
A가 죽어도 B가 실행되도록 하려면
어떻게 해야 할까요?
데몬으로 실행하면 됩니다.
약식예제를 보이면 아래와 같습니다.
main()
{
int pid;
pid = fork();
if ( pid == -1 ) { // fork자체 실패
printf("can't fork \n");
exit(0);
}
if ( pid == 0 ) { // child
close(0);
close(1);
close(2); // 파일을 닫을 때, 우리는 이미 3개의 파일만이 열린것을
// 안다. 만일 모른다면 루프 돌아야겠지......
setsid();
while(1) // cpu를 무지 소모하는 루프
; // busy?? pause();
}
else { // 부모 프로세스
sleep(30); // 부모는 그냥 죽어도 되나, 확인을 위해 30초나 살아있게함.
}
return 0;
}
이 프로그램의 실행파일명을 test라고 가정하면
./test 라고 실행하자.
위 프로그램을 컴파일 실행후 터미널을 하나 더 띄어서 ps -ef | grep test를 수행하여, 2개가 떠 있음을 확인한다.
2개의 test라는 프로세스가 보이게 되며, 하나는 부모이고 하나는 자식이다.
구분은 당연히 부모의 pid를 보면 안다.
이후 30초 경과후 부모가 죽어도 자식 프로세스는 지속적으로 살아 있음을 확인한다.
** 참고: 만일 수행되는 자식 프로세스가 통신 처리를 수행한다면,
자식프로세스는 통신 오류로 인해 죽는 일이 없도록 시그널처리를
해주어야 하며, 만일 file io를 수행한다면 chdir(), umask()를 처리하여
이후에 파일처리로 인한 오류를 없도록 유의한다.
데몬으로 수행될 자식 프로세스가 죽는다면 그것은 오직 관리자의 손에 의해,
또는 덜완성되어서(프로그램버그) 이어야만 한다.물론 후자는 없어져야 하는
것이겠지요.
부모 프로세스에서 생성된 자식 프로세스가 데몬이 되게 하려는것이 맞는지.
부모 프로세스에서 생성된 자식 프로세스가 데몬이 되게 하려는것이 맞는지..
그렇게 할거라면 fork()후에 자식이 exec로 코드 실행할때..
ppid를 1번으로 바꿔주면 되지 않나요?? 안되는강..ㅡㅡㅋ
저도 지금 확실히 기억이 나질 않는군요..
컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러
Re: 아예 새로운 process를 생성?
부모가 죽어도 자식은 바로 안죽던데요.
쓰레드랑 착각하신 게 아닐지...
아무튼 터미널이 종료해도 안죽게 하려면
fork()하고 setsid()를 부르면 될 겁니다.
자세한 건 데몬으로 검색해보세요...
부모가 먼저 종료되어 버리면.. 자동으로 init가 부모가 되고..좀
부모가 먼저 종료되어 버리면.. 자동으로 init가 부모가 되고..
좀비 프로세스가 되는걸로 알고 잇는데.. 질문 올리신 분의 의도는
좀비나 뭐 그런 상태가 되지 않고.. fork()된 자식도 완전히 별개의
프로세스가 되길 원하시는게 아닌가요?? 아닌강..^^;;
프로세스 기반에서는 자식을 제대로 종료시켜주지 않으면 제대로 죽지 않죠..
컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러
[quote="shs0917"]부모가 먼저 종료되어 버리면.. 자동으로
고아 프로세스를 말씀하시는 것 같은데...
어쨌든 부모가 죽어도, 터미널이 죽기 전까진
꿋꿋하게 살아가지 않습니까... 질문하신 분은
부모가 죽으면 자식도 바로 죽는다고 말씀하시는 것 같아서요.
음...
그렇다면
...
이렇게 구현했다고 하면;;
콘솔에서 돌아가는데 컨트롤 C가 들어가면;; 다 죽어버리드라구요;;
시그널 핸들링만 해주면;;
자식은 계속해서 돌아가게 되나요?
VENI VIDI VICI
음.. 제가 기억이 잘 나지는 않는데요.. 데몬 프로세스를 만드는 방법을
음.. 제가 기억이 잘 나지는 않는데요.. 데몬 프로세스를 만드는 방법을
한번 찾아보시면 도움이 되지 않을까요??
컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러
시그널... 답인것 같군요.보통의 네트워크 프로그램에서 사용하는 방법
시그널... 답인것 같군요.
보통의 네트워크 프로그램에서 사용하는 방법인데 Child에 대한 처리를 '무시'하게
만들면 됩니다.
간단한 사용방법은
http://project.honeynet.org/reverse/results/sol/sol-19/listings/mainmonster.c
를 참고해보세요.
가끔 Deamon형태로 만들어지는 서버들이 아래와 같은 방법을 이용하기도 합니다.
물론 Child에 대한 시그널을 무시하도록 설정하고요...
...
pid = fork ();
if (pid 가 root이면) exit (0);
pid = fork ();
if (pid 가 root이면) exit (0);
child가 실제 root가 되어서 deamon형태를 실행...
...
각 OS별로 fork시에 좀비나 defunt가 발생하지않도록 하는 방법이 있는데
제가 받은 소스가 HP에서 만든 OS(UNIX계열)였고 실제 구현은 DEC UNIX에서
했지만 위형태의 방법이 그대로 적용되더군요.
물론 fork를 한번만 사용하면 root에 대한 좀비가 발생을 했었던걸로 기억합니다.
따라서 두번의 fork로 완전하게 root가 누구였는지를 상실하게 했었죠.
음... 이유는 아직도 잘모르겠지만 그렇게 방법을 배워서 LINUX에서도 여러번
사용했었죠. 물론 LINUX에서도 동작은 잘했습니다.
다른 OS(UNIX)에서는 사용해보질 않았지만 특별히 문제가 되진 않을겁니다.
다른 서버소스를 잠시 살펴보아도 시작을 위와 같은 형태로 하는것들이 왕왕
있더군요.(제가 보았던 대부분의 데몬서버를이... :))
------------------------------
좋은 하루 되세요.
Re: 아예 새로운 process를 생성?
아닙니다.
부모가 죽는다고 죽는것은 절대로 아닙니다. (만일 부모가 자기 죽을 때,
자식프로세스에게 죽으라는 signal을 인위적(프로그램으로 작성;또는 shell에서
kill ****)으로 보내지 않는한 죽을 일 없습니다.)
데몬으로 실행하면 됩니다.
약식예제를 보이면 아래와 같습니다.
이 프로그램의 실행파일명을 test라고 가정하면
./test 라고 실행하자.
위 프로그램을 컴파일 실행후 터미널을 하나 더 띄어서 ps -ef | grep test를 수행하여, 2개가 떠 있음을 확인한다.
2개의 test라는 프로세스가 보이게 되며, 하나는 부모이고 하나는 자식이다.
구분은 당연히 부모의 pid를 보면 안다.
이후 30초 경과후 부모가 죽어도 자식 프로세스는 지속적으로 살아 있음을 확인한다.
** 참고: 만일 수행되는 자식 프로세스가 통신 처리를 수행한다면,
자식프로세스는 통신 오류로 인해 죽는 일이 없도록 시그널처리를
해주어야 하며, 만일 file io를 수행한다면 chdir(), umask()를 처리하여
이후에 파일처리로 인한 오류를 없도록 유의한다.
데몬으로 수행될 자식 프로세스가 죽는다면 그것은 오직 관리자의 손에 의해,
또는 덜완성되어서(프로그램버그) 이어야만 한다.물론 후자는 없어져야 하는
것이겠지요.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
그렇군요!
그렇군요! :lol:
제가 잘못 생각하고 있었나봅니다.
시그널을 처리 해주니까 죽지 않고 돌아가는군요 ㅠ.ㅜ
이런 기쁠수가.. .-0-.
:wink:
VENI VIDI VICI
댓글 달기