함수 기능
디몬 프로세스는 백그라운드에서 긴 시간 동작하는 프로세스이다. 디몬프로세스는 부팅시 실행되어 OS가 해야할 일들을 수행한다. 안정적인 디몬수행을위해 규칙에 맞추어 프로그램을 수행하여야한다.
함수
1. 백그라운드 수행이 되어야 한다.
2. 프로세스 그룹에서 탈퇴, 새로운 프로세스 그룹을 생성한다.
3. 터미널 입출력 시그널을 무시한다.
4. 파일 모드 생성 마스크를 해제한다.
5. 현재 디렉토리를 루트 디렉토리로 생성한다.
6. 오픈되는 모든 파일 디스크립터를 닫는다.
7. 표준 입출력과 표준 에러를 /dev/null로 재지정한다.
함수 예제
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
#include <syslog.h>
#include <sys/stat.h>
#include <sys/types.h>
int ssu_daemon_init(void);
int main(void) {
pid_t pid;
//process id
pid = getpid();
printf("parent process : %d\n", pid);
printf("daemon process initialization\n");
//daemon 생성
if(ssu_daemon_init() < 0) {
fprintf(stderr, "ssu_daemon_init failed\n");
exit(1);
}
exit(0);
}
int ssu_daemon_init(void) {
pid_t pid;
int fd, maxfd;
//자식 프로세스 생성
if((pid = fork()) < 0) {
fprintf(stderr, "fork error\n");
exit(1);
}
else if(pid != 0)
exit(0);
//process id
pid = getpid();
printf("process %d running as daemon\n", pid);
//session 생성
setsid();
//SIGTTIN, SIGTTOU, SIGTSTP 시그널 무시
signal(SIGTTIN, SIG_IGN);
signal(SIGTTOU, SIG_IGN);
signal(SIGTSTP, SIG_IGN);
//파일 디스크립터 테이블 크기
maxfd = getdtablesize();
//모든 fd 닫음
for(fd = 0; fd < maxfd; fd++)
close(fd);
//masking 안함
umask(0);
//작업 디렉터리를 루트로 설정
chdir("/");
//표준입력, 표준출력, 표준에러를 /dev/null로 redirection
fd = open("/dev/null", O_RDWR);
dup(0);
dup(0);
return 0;
}
함수 결과
리눅스시스템 프로그래밍 - 홍지만 저
교재 내에 있는 예제를 바탕으로 작성한 글 입니다.
'C & LINUX' 카테고리의 다른 글
C / LINUX sigpending(2) (0) | 2022.05.31 |
---|---|
C / LINUX sigprocmask(2) (0) | 2022.05.31 |
C / LINUX alarm(2) (0) | 2022.05.31 |
C / LINUX raise(3) (0) | 2022.05.31 |
C / LINUX signal(2) (0) | 2022.05.31 |