이유없이(?) fork()한다???

ckebabo의 이미지

몇몇 소스를 보다보면,

if(do_fork) {
    pid_t pid;

    if((pid=fork() == -1)
        perror("Could not fork");

    if(pid != 0)
        exit(0);
}

처럼 그냥 자신이 계속 수행해도 되는 것인데도 자식프로세스를 만들고는 정작 자신은 죽어버리는 것이 몇몇 있습니다. 이렇게 하는 무슨 특별한 이유가 있는 것인가요?
익명 사용자의 이미지

데몬으로 만들기 위해서입니다.
터미널에서 프로그램을 실행하면 터미널의 child가 되니 터미널을 종료하거나 중지하면 해당 프로세스가 종료됨을 방지하기 위해서입니다.

crimsoncream의 이미지

우선 이렇게 하면 이 프로그램을 invoke한 터미널에 제어를 돌려줄 수 있습니다.
그리고 setsid를 해서 기존의 프로세스들과 무관한 session을 만들수 있고요.
목적은 물론 윗분이 쓰신데로 daemon을 만들기 위한 거겠죠.
좀 더 완벽을 기하고 싶다면 이 상태에서 fork를 한번 더하면 이 프로세스가 session leader도 아니게 되므로 컨트롤링 터미널을 절대 가질 수 없게 되겠죠.

오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.

sangwoo의 이미지

crimsoncream wrote:
우선 이렇게 하면 이 프로그램을 invoke한 터미널에 제어를 돌려줄 수 있습니다.
그리고 setsid를 해서 기존의 프로세스들과 무관한 session을 만들수 있고요.
목적은 물론 윗분이 쓰신데로 daemon을 만들기 위한 거겠죠.
좀 더 완벽을 기하고 싶다면 이 상태에서 fork를 한번 더하면 이 프로세스가 session leader도 아니게 되므로 컨트롤링 터미널을 절대 가질 수 없게 되겠죠.

또는 fork()후 setsid()를 호출해 주셔도 되겠습니다. :)

----
Let's shut up and code.

cinsk의 이미지

답변은 앞 분들이 다 해주셨습니다. 사실 이 부분은 약간은 골치아픈 부분입니다. 자주 코딩해야 하는 부분도 아니라서 암기도 쉽지 않기 때문일까요?

아뭏든, 이 부분 관련해서 "Advanced Programming in the UNIX Environment"를 읽어보시면 모든 게 다 이해되리라 생각합니다. (Stevens, Addison Wesley)

Chapter 9 Process Relationships와 Chapter 13. Daemon Processes를 읽어보시기 바랍니다.

crimsoncream의 이미지

제가 의도한 바는

fork ()
setsid ()
fork ()

였는데.

setsid ()
fork ()

로 이해하신것 같네요.
그리고 sangwoo 님은 술한잔하게 놀러 좀 오시죠 :)

sangwoo wrote:
crimsoncream wrote:
우선 이렇게 하면 이 프로그램을 invoke한 터미널에 제어를 돌려줄 수 있습니다.
그리고 setsid를 해서 기존의 프로세스들과 무관한 session을 만들수 있고요.
목적은 물론 윗분이 쓰신데로 daemon을 만들기 위한 거겠죠.
좀 더 완벽을 기하고 싶다면 이 상태에서 fork를 한번 더하면 이 프로세스가 session leader도 아니게 되므로 컨트롤링 터미널을 절대 가질 수 없게 되겠죠.

또는 fork()후 setsid()를 호출해 주셔도 되겠습니다. :)

오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.

sangwoo의 이미지

crimsoncream wrote:

그리고 sangwoo 님은 술한잔하게 놀러 좀 오시죠 :)

이번주 토요일에 놀러가겠습니다.. :-) 일토 맞죠?

----
Let's shut up and code.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.