daemon 프로그램 짜기
2016/11/02
서론
차분히 정리하려고 찜찜했던 것을 찾으려고 보니, 좋은 글이 이미 있다;;
http://cinsk.github.io/articles/daemon.html
따라서, 그 글을 보는 것이 좋다.
데몬 프로그램 작성에 관한 규칙들을 대충은 알고 있었지만, 체계적으로 정리하게 된 계기는 memcached다. memcached를 뜯어보며 쳬계성을 얻었다.
요약
- fork로 자식 생성. 이 자식아.
- 부모는 그대로 안녕. 이때 _exit()를 호출하는데, stdio 플러시가 없어서 버퍼 찌꺼기가 fd로 상속된 파일에 기록되지 않도록 한다. (이게 제일 큼, 위에 소개한 링크에선 tmpfile 삭제 방지까지 거론하고 있다.
- setsid 호출. 세션을 분리하여 데몬으로 뜬 자식이 뭘 먹거나 뱉지 못하도록 한다.
- cwd 변경. 속시원히 루트로 보내자. 자식아 더 큰 곳을 향해 나아가렴.
- /dev/null을 stdio, stderr로 복사하여 뭔가 화면에 오고가는게 없도록 하자. dup2!
- SIGHUP, SIGTERM 핸들러 작성 : SIGHUP은 받았을 때 파일 재오픈 등을 처리하고, SIGTERM은 죽을 때 예쁘게 죽도록 만든다. 자원 정리!
- umask 지정. 귀찮으면 0.
- pid 파일. 보통 중복 실행을 막거나 실행 여부 에이전트 데몬등과의 연결성을 위해 만든다. /var/run/xxx/xxx.pid나 원하는 모처에 pid를 기록한다.
써 놓고 보니 위 링크의 글이 너무 좋다.. 망한 요약글.
데몬 만들기 참 쉽죠?
추가 : SIGHUP 대응으로 열린 파일을 다 닫으려면 getdtablesize를 쓴다.
http://www.4pmp.com/2009/12/a-simple-daemon-in-c/
[t:/] is not "technology - root". dawnsea, rss