콘텐츠로 건너뛰기

daemon화 하는 함수

  • 기준
이전 주제 보기 :: 다음 주제 보기  
글쓴이 메시지
pooshap
beginner
beginner

가입: 2003년 4월 3일
올린 글: 1

올리기올려짐: 2003년4월3일 17:46    주제: daemon화 하는 펑션에 대해 질문할게요. 인용과 함께 답변

다음 과 같은 함수는 대몬화 하는 함수입니다.

int daemon_init(void)

{

pid_t pid;

if ( (pid = fork()) < 0)

return (-1);

else if (pid != 0)

exit(0); /* parent goes bye-bye */

/* child continues */

setsid(); /* become session leader */

chdir(“.”); /* change working directory */

umask(0); /* clear our file mode creation mask */

return (0);

}

함수가 이해가 안되는것이 아니고 왜 이렇게 하는지를 모르겠내요.

자세한 설명 부탁드릴게요.

위로
사용자 정보 보기 비밀 메시지 보내기 MSN 메신저
no4822
novice
novice

가입: 2003년 2월 18일
올린 글: 15

올리기올려짐: 2003년4월3일 19:16    주제: 여기로다… 인용과 함께 답변

잘 설명되져 있는데군여….

http://www.joinc.co.kr/modules.php?name=News&file=article&sid=24 icon_wink.gif
_________________
건강하시고 행복하세요.

위로
사용자 정보 보기 비밀 메시지 보내기 이메일 보내기 글 올린이의 웹사이트 방문 MSN 메신저
bookworm
게시판 관리자
게시판 관리자

가입: 2002년 12월 20일
올린 글: 36
위치: 서울

올리기올려짐: 2003년4월4일 9:02    주제: 리눅스에서는 함수가 있습니다. 인용과 함께 답변

인용:
DAEMON(3) Linux Programmer’s Manual DAEMON(3)

NAME

daemon – run in the background

SYNOPSIS

#include <unistd.h>

int daemon(int nochdir, int noclose);

DESCRIPTION

The daemon() function is for programs wishing to detach themselves from

the controlling terminal and run in the background as system daemons.

Unless the argument nochdir is non-zero, daemon() changes the current

working directory to the root (“/”).

Unless the argument noclose is non-zero, daemon() will redirect stan-

dard input, standard output and standard error to /dev/null.

RETURN VALUE

(This function forks, and if the fork() succeeds, the father does

_exit(0), so that further errors are seen by the child only.) On suc-

cess zero will be returned. If an error occurs, daemon() returns -1

and sets the global variable errno to any of the errors specified for

the library functions fork(2) and setsid(2).

SEE ALSO

fork(2), setsid(2)

NOTES

The glibc implementation can also return -1 when /dev/null exists but

is not a character device with the expected major and minor numbers. In

this case errno need not be set.

HISTORY

The daemon() function first appeared in BSD4.4.

BSD MANPAGE 1993-06-09 DAEMON(3)


_________________
Bookworm

위로
사용자 정보 보기 비밀 메시지 보내기 이메일 보내기 글 올린이의 웹사이트 방문 MSN 메신저
Dr_stein
novice
novice

가입: 2003년 2월 11일
올린 글: 17
위치: Lost Temple

올리기올려짐: 2003년4월4일 12:35    주제: 인용과 함께 답변

fork()를 하는건 init의 차일드가 되면서, 또한 setsid()를 콜할때 자신이 세션

리더가 아닐수 있게 보장을 한다고 알고 있습니다.

setsid()를 하게 되면 새로운 세션을 만들고 그 세션의 리더가 되는데

그로 인해 현재 로긴한 쉘과다른 세션에 속하고 결국 터미널을 가지지 않게

됩니다.

여러가지 방법이 있을수 있지만, 데몬이 어떤거여야 하는가라는 필요에 의해

이런식으로 구현을 한다고 말할 수 있겠지요.
_________________
死因?? 난아직 죽지 않았는데 s`ㅡ´)a

위로
사용자 정보 보기 비밀 메시지 보내기 MSN 메신저
xfmulder
beginner
beginner

가입: 2003년 3월 28일
올린 글: 4

올리기올려짐: 2003년4월4일 12:47    주제: 데몬으로 되기 인용과 함께 답변

일단 fork()해서 자신은 죽고 CHILD 를 남기는 이유는 init 의 자식이 되기 위해서이지요.

setsid() 함으로써 자신이 기존의 세션과 분리되면 제어 터미널을 잃습니다.

이때 getpgid() 하면 이전의 프로세스 그룹 으로부터도 독립되어 있게 됩니다.

참고로 프로세스와 관련된 id 는 네가지 입니다. pid, ppid, pgid(프로세스그룹), sid(세션ID) (getpid(), getppid() , getpgid() , getsid() 를 찾아보세요 )

세션id를 독립하면 자동으로 프로세스그룹ID(pgid) 도 sid 값으로 바뀝니다.

기존의 프로세스가 kill(0,SIGTERM); 하면 자신의 프로세스 그룹에 15번 시그널을 날리는데 이 데몬은 이미 프로세스그룹에서 독립했으므로 이 시그널 안받습니다. 물론 기존의 제어터미널에서도 독립했습니다.

chdir(“/”); 하는건 현재디렉토리를 변경하는것. (자신이 로그를 기록할 적당한 디렉토리로 가도 됩니다. 상대PATH로 파일명 줄수 있음)

umask(0); umask 를 0 으로 했으므로 파일생성 모드 대로 생성됨.

(예를 들면 umask (022) 이면 파일을 rwxrwxrwx 로 생성해도 umask때문에

rwxr-xr-x 로 만들어 지게 됩니다)

위로
사용자 정보 보기 비밀 메시지 보내기

이전 글 표시:   

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다