1. background로 수행되도록 한다.
- fork()를 호출하여 parent를 종료한다.
- child 프로세스는 프로세스 그룹의 리더가 아니다.
if(fork()>0)
exit(0);
2. 새로운 세션을 생성한다.
- 세션의 리더가 된다.
- 제어 터미널과 단절된다.
setsid();
3. 열려진 모든 file descriptor를 닫는다.
- daemon을 실행시킨 프로세스로 부터 상속받은 모든 fd를 닫는다.
for(I=0;I<64;I++)
close(I);
4. 작업 디렉토리를 root로 바꾼다.
- mount된 파일 시스템을 unmount 가능하도록 하기 위해
chdir(“/”);
5. 파일 생성 마스크를 제거한다.
- parent(자기를 기동한 프로세스)로 부터 물려받은 umask를 제거
umask(0);
6. SIGCLD 시그널을 처리한다.
- 자식이 발생하는 SIGCLD를 대응 하지 않으면 zombie가 된다.
signal(SIGCLD,SIG_IGN);
=================================================================================
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>
int daemon_init(void)
{
pid_t pid;
int i;
if(fork() > 0)
exit(0);
/* child continues */
setsid(); /* become session leader */
chdir("/"); /* change working directory */
umask(0); /* clear our file mode creation mask */
for(i=0;i<64;i++)
close(i);
signal(SIGCLD,SIG_IGN);
return(0);
}
main(void)
{
daemon_init();
sleep(20);
}
'IT_Programming > System Programming' 카테고리의 다른 글
GDB를 이용한 디버깅 (0) | 2009.05.26 |
---|---|
Gcc Complie & Linking (0) | 2009.05.19 |
[Linux] 프로세스 체인, 프로세스 팬 만들기 (0) | 2008.01.19 |
[Linux] 데몬을 위한 fork() (0) | 2007.12.15 |
[Linux] 세마포어 핸들링 (0) | 2007.11.18 |