아예 새로운 process를 생성?

Seven..의 이미지

프로세스 안에서 하나의 process를 생성하게 되면 (fork등..)

부모가 죽으면 죽어버리잖아요..

프로그램(A) 안에서 다른 프로그램(B)을 실행시키고

A가 죽어도 B가 실행되도록 하려면

어떻게 해야 할까요?

shs0917의 이미지

부모 프로세스에서 생성된 자식 프로세스가 데몬이 되게 하려는것이 맞는지..
그렇게 할거라면 fork()후에 자식이 exec로 코드 실행할때..
ppid를 1번으로 바꿔주면 되지 않나요?? 안되는강..ㅡㅡㅋ
저도 지금 확실히 기억이 나질 않는군요..

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

맹고이의 이미지

Seven.. wrote:
프로세스 안에서 하나의 process를 생성하게 되면 (fork등..)

부모가 죽으면 죽어버리잖아요..

프로그램(A) 안에서 다른 프로그램(B)을 실행시키고

A가 죽어도 B가 실행되도록 하려면

어떻게 해야 할까요?

부모가 죽어도 자식은 바로 안죽던데요.

쓰레드랑 착각하신 게 아닐지...

아무튼 터미널이 종료해도 안죽게 하려면

fork()하고 setsid()를 부르면 될 겁니다.

자세한 건 데몬으로 검색해보세요...

shs0917의 이미지

부모가 먼저 종료되어 버리면.. 자동으로 init가 부모가 되고..
좀비 프로세스가 되는걸로 알고 잇는데.. 질문 올리신 분의 의도는
좀비나 뭐 그런 상태가 되지 않고.. fork()된 자식도 완전히 별개의
프로세스가 되길 원하시는게 아닌가요?? 아닌강..^^;;
프로세스 기반에서는 자식을 제대로 종료시켜주지 않으면 제대로 죽지 않죠..

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

맹고이의 이미지

shs0917 wrote:
부모가 먼저 종료되어 버리면.. 자동으로 init가 부모가 되고..
좀비 프로세스가 되는걸로 알고 잇는데.. 질문 올리신 분의 의도는
좀비나 뭐 그런 상태가 되지 않고.. fork()된 자식도 완전히 별개의
프로세스가 되길 원하시는게 아닌가요?? 아닌강..^^;;
프로세스 기반에서는 자식을 제대로 종료시켜주지 않으면 제대로 죽지 않죠..

고아 프로세스를 말씀하시는 것 같은데...

어쨌든 부모가 죽어도, 터미널이 죽기 전까진

꿋꿋하게 살아가지 않습니까... 질문하신 분은

부모가 죽으면 자식도 바로 죽는다고 말씀하시는 것 같아서요.

Seven..의 이미지

그렇다면

...

int pid=fork();
if(pid==0)
{
    ...
}
else
{
   ...
}
exit(0);

이렇게 구현했다고 하면;;
콘솔에서 돌아가는데 컨트롤 C가 들어가면;; 다 죽어버리드라구요;;
시그널 핸들링만 해주면;;
자식은 계속해서 돌아가게 되나요?

VENI VIDI VICI

shs0917의 이미지

음.. 제가 기억이 잘 나지는 않는데요.. 데몬 프로세스를 만드는 방법을
한번 찾아보시면 도움이 되지 않을까요??

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

codebank의 이미지

시그널... 답인것 같군요.
보통의 네트워크 프로그램에서 사용하는 방법인데 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)에서는 사용해보질 않았지만 특별히 문제가 되진 않을겁니다.
다른 서버소스를 잠시 살펴보아도 시작을 위와 같은 형태로 하는것들이 왕왕
있더군요.(제가 보았던 대부분의 데몬서버를이... :))

------------------------------
좋은 하루 되세요.

mach의 이미지

Seven.. wrote:
프로세스 안에서 하나의 process를 생성하게 되면 (fork등..)

부모가 죽으면 죽어버리잖아요..


아닙니다.

부모가 죽는다고 죽는것은 절대로 아닙니다. (만일 부모가 자기 죽을 때,
자식프로세스에게 죽으라는 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()를 처리하여
이후에 파일처리로 인한 오류를 없도록 유의한다.
데몬으로 수행될 자식 프로세스가 죽는다면 그것은 오직 관리자의 손에 의해,
또는 덜완성되어서(프로그램버그) 이어야만 한다.물론 후자는 없어져야 하는
것이겠지요.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

Seven..의 이미지

그렇군요! :lol:
제가 잘못 생각하고 있었나봅니다.
시그널을 처리 해주니까 죽지 않고 돌아가는군요 ㅠ.ㅜ
이런 기쁠수가.. .-0-.
:wink:

VENI VIDI VICI

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.