데몬 프로그램에서 stdout 리다이렉션
글쓴이: 익명 사용자 / 작성시간: 월, 2002/11/11 - 7:13오후
아래와 같이 데몬 프로세스로 만들고, 이후 stdout을 리다이렉션하여
printf 문장으로 로그를 찍고자 합니다.
그런데 생각처럼 안되는군요.
데몬 프로세스를 만드는 루틴을 빼면 정상적으로 log.dat 파일에 로그가
생기나 다시 집어넣으면 로그를 찍지 못하는데 이유를 잘 모르겠네요.
많은 조언 부탁드립니다.
if(start_daemon() != 0) {
printf("can't start daemon\n");
exit(1);
}
/* close all open files.. */
for(nIdx=0; nIdx<10; nIdx++) close(nIdx);
/* open null file for 0.. */
nFd0 = open("./zero.dat", O_CREAT|O_RDWR, 0666);
nFd1 = open("./log.dat", O_CREAT|O_RDWR, 0666);
/* log message.. */
for(nIdx=0; nIdx<10; nIdx++) printf("This is test message..\n");
Forums:
Re: 데몬 프로그램에서 stdout 리다이렉션
데몬으로 프로세스를 띄우려면 stdin/out 을 끊어버려야 합니다. 그래서
데몬에서는 stdin/out 입출력이 안되죠..
해결 했습니다.(자문 자답)
데몬 프로세스를 만드는 경우,
현 디렉토리를 모 디렉토리로 (/) 이동하기에 파일을 만들때
./filename을 주어 open 하면 안되는것 같습니다.
말씀하신대로 데몬 프로세스 만드는 루틴에서 열려있는 모든 file
descriptor를 닫았고,
그외에도 만약을 대비해서 다시 10번까지 닫았습니다.
그리고 나서 파일의 전체 경로 명을 써주니 로그가 쌓이는 군요.
그럼 좋은 하루 되세요.
p.s. 대답 감사합니다.
리눅스 데몬 프로그램 작성시 주의사항
file descriptor는 1부터 close하는게 좋습니다.
mysqlclient등의 라이브러리를 호출해서 사용하는 경우
문제가 생깁니다.
오래돼서 왜 그런지는 다시 차근차근 생각해봐야 될거 같은데
일반적인 유닉스 데몬 프로그래밍 하는 거랑 차이가 있는 부분이
여깁니다.
그냥 참조하세요
댓글 달기