소스 설명좀 부탁드립니다.

위하여의 이미지

코드는 아래와 같습니다.

	

    pid_t pid;
	
	if((pid = fork()) != 0 )	
	{
		printf("pid = %ld \n", pid);
		exit(0);
	}
	
		
	setsid();
		
	signal(SIGHUP, SIG_IGN);
			
	if( (pid = fork()) != 0 )	
	{
	    printf("pid = %ld \n", pid);
		exit(0);
	}		
					
					
	umask(0);
						
	for( int i = 0; i < 64; i++ ) 
	    close(i);
	
	g_main.pid = getpid();
	printf("g_main.pid = %ld\n", g_main.pid);
				
	// 시그널 설정
	signal( SIGINT, SignalHandler_SIGINT );
	signal( SIGTERM, SignalHandler_SIGINT );
	signal( SIGSEGV, SIG_IGN );
	signal( SIGPIPE, SIG_IGN );

	Syslog( LOG_INFO, "InitDaemon()..." );

현재 위소스에 대해서 이해하고 있는 바로는,
유닉스 네트워크프로그래밍 책을 읽어보니,
백그라운드에서 작동하는 데몬을 만드는 거 인듯 합니다.
그러나 제 생각이 맞는것지도 의심스럽고, 왜? 포크를 두번하는지도 모르겠고, close(i)를 왜? 64번 하는지도 모르겠습니다.
위소스에 대해 모든면에서 정확히 이해를 할 수 없어서 질문 올립니다.
번거로우시겠지만, 위 소스가 어떻게 진행되는건지를 자세히점 설명해 주셨으면 합니다.
:oops: 좋은 하루 되십시오. :oops:
최종호의 이미지

거의 UNP (Unix Network Programming) 에서 가져온 코드 같습니다.

Richard Stevens의 Unix Network Programming. vol. 1 의

12.4 daemon_init Function 절 (2판 기준)에 원하시는 설명이 잘 나와있습니다.

chdir("/"); 코드는 빼 먹으신 듯...

lovemyin의 이미지

우선 fork 를 호출해서 자식프로세스를 생성시킨 다음 부모프로세스를 종료하는 이유는 자식 프로세스의 관리프로세스를 PID 1번인 init 프로세스가 담당하게 하기 위해서이구요...

setsid를 하는 이유는 새로운 새션을 생성하기 위해서 입니다. 자신만의 독자적인 길을 가기 위해서죠....

fork()를 한번 해도 데몬을 생성할 수 있지만 Stevens 책에 보면 두번 하기를 권장하더군요...

하나 빠진게 chdir 을 이용하여 프로세스가 루트디렉토리에서 작업을 수행하도록 변경시켜주는 부분인데 이 부분을 추가해주세요... 물론 하시지 않아도 상관은 없습니다. 권장사항입니다.

file descrptor 닫는 부분이나 시그널 처리하는 건 당연히 안전을 위해서겠죠

많은 도움이 되었으면 하네요... 수고하세요

/***************************************************
* 가장 심플한 것이 가장 아름다운 것이다.
***************************************************/

댓글 달기

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