데몬을 만들때 왜 파일을 close을 하나요?
다음은 제가 인수인계 받은 소스의 일부분입니다.
int GoDaemon(void) {
int i;
pid_t pid;
if ( (pid = fork()) != 0)
{
exit(0); //Terminate. destroy parent - daemon
}
setsid(); // set session leader
if ( (pid = fork()) != 0)
{
exit(0); //Terminate. destroy the 2nd parent - daemon
}
umask(022);
chdir("/");
for (i = 0; i < 64; i++) // clear fd
close(i);
return 0;
}
프로그램을 데몬으로 띄우면 보통 다음과 같이 프로그램을 짜는데
제가 의문이 드는곳은
for (i = 0; i < 64; i++) // clear fd
close(i);
에서 0 부터 64가 열려있는 모든 fd을 닫아버리면
다른 프로그램에서 socket 이나 file을 열어서 fd가 64 보다 작으면
다른 프로그램에 영향을 줄것 같은데요..
다른 사람들 의견은 어떤가요?
왜 그리고 데몬을 만드면서 close을 해야 되는지도 잘 모르겠어요?
그럼 즐플하세여
물려받은 fd를 닫는 겁니다.
보통 fork하면 부모프로세스의 FD를 물려받으니까 깨끗하게 청소하고 다시 열려고 하는 것 같습니다. 근데 좀 이상하네요. 굳이 fork를 두번 할 필요까지 있었나요?
보통 부모와 연결되어서 fd를 공유하길 원하지 않는 경우 그렇게 하지만, daemon으로 만드는데 굳이 fd를 닫아야 하는 이유까지는 별로 없습니다만, 무슨 이유가 있었겠죠.
========================================
* The truth will set you free.
[quote]다른 프로그램에서 socket 이나 file을 열어서 fd가
보통 daemon 프로세스가 되는 코딩을 전체 코딩의 시작 부분에 넣기 때문에 깨끗하게 비우는 의미입니다. daemon 프로세스가 0, 1, 2 번 fd를 open하고 있어야 하는 경우는 별로 없죠.
'다른 프로그램'의 의미가 설마 다른 프로세스를 말씀하시는 것은 아니겠죠?
second fork 의 이유는 session leader가 되지 않기 위해서 라고 하네요. SVR4 환경에서는 session leader가 controlling terminal을 갖는 rule 이 있다고 합니다.
자세한 내용은 stevens 책을 보시면 잘 나옵니다.
우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자
제가 말씀드린것은 다른 프로세스 입니다.
보통 open된 파일,소켓 descripter는 커널에서 일관적으로
번호를 넘겨주는것으로 알고있는데 ..
예를 들어 aaa 라는 프로세스가 소켓을 열면 커널에서 fd값을 5로 주었다고 하면 bbb 라는 프로세스가 소켓을을 열면 fd값을 6을 주는것으로 알고있습니다.
이렇게 커널에서 fd의 번호를 일관적으로 부여하는것으로 알고있습니다.
그런데. aaa라는 프로세스가 임으로 0 부터 64까지 fd를 강제로 닫아버리면
bbb 프로세스에 열린 fd가 close을 되면서 bbb 프로세스가 문제가 있을것 같은데 아닌가요?.. -.-;;
그리고 부모프로세스에서 자식에게로 fd을 상속하지 않을려면
해당 fd에 대해서 close and exec 라는 방법을 사용하지 않는가요?..
많이 헷갈리네여..
여러분의 많은 의견 부탁드립니다.
그럼 즐플하세여
[quote]예를 들어 aaa 라는 프로세스가 소켓을 열면 커널에서 fd
file descriptor는 프로세스마다 별도로 증가됩니다.
하나의 프로세스에서 파일을 open 할때 몇번 fd가 할당되는가는 해당 프로세스에서 이전에 open해서 할당 받은 fd와 관계있을 뿐, 다른 프로세스가 몇번 fd를 가지고 있는지와는 전혀 상관없습니다.
exec 에만 관계되는 내용이며, fork에서는 소용없습니다.
우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자
고맙습니다..
바쁘실건데.. 답변을 해주셔서 감사합니다.
조은 하루 되세여. ^^
음 한번의 fork()면 session leader가 아닌것을 보장하고
음 한번의 fork()면 session leader가 아닌것을 보장하고 있는줄 알았는데...
하얀책(스티븐책)을 다시 함 읽어봐야겠네여 -_-;;
앞마당 먹고 시작한 저그의 8할은 뮤탈 테크를 먼저 탄다. 하지만 나머지 2할때문에 항상 스켄이 모자란다. - _-;
댓글 달기