소스 설명좀 부탁드립니다.
글쓴이: 위하여 / 작성시간: 목, 2004/07/01 - 3:18오후
코드는 아래와 같습니다.
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:
Forums:
거의 UNP (Unix Network Programming) 에서 가져온
거의 UNP (Unix Network Programming) 에서 가져온 코드 같습니다.
Richard Stevens의 Unix Network Programming. vol. 1 의
12.4 daemon_init Function 절 (2판 기준)에 원하시는 설명이 잘 나와있습니다.
chdir("/"); 코드는 빼 먹으신 듯...
설명을 하자면...
우선 fork 를 호출해서 자식프로세스를 생성시킨 다음 부모프로세스를 종료하는 이유는 자식 프로세스의 관리프로세스를 PID 1번인 init 프로세스가 담당하게 하기 위해서이구요...
setsid를 하는 이유는 새로운 새션을 생성하기 위해서 입니다. 자신만의 독자적인 길을 가기 위해서죠....
fork()를 한번 해도 데몬을 생성할 수 있지만 Stevens 책에 보면 두번 하기를 권장하더군요...
하나 빠진게 chdir 을 이용하여 프로세스가 루트디렉토리에서 작업을 수행하도록 변경시켜주는 부분인데 이 부분을 추가해주세요... 물론 하시지 않아도 상관은 없습니다. 권장사항입니다.
file descrptor 닫는 부분이나 시그널 처리하는 건 당연히 안전을 위해서겠죠
많은 도움이 되었으면 하네요... 수고하세요
/***************************************************
* 가장 심플한 것이 가장 아름다운 것이다.
***************************************************/
댓글 달기