[http://linux.die.net/man/1/daemonize][1]]의 지침에 따라 Linux에서 데몬 프로그램을 작성했지만 프로세스가 여러 번 중단되어 그 이유를 찾을 수 없습니다. 그것은 며칠 동안 나를 괴롭혔다.리눅스에서 c/C++ 프로그램을 daemonize하는 방법
오늘 나는 W.Richard Stevens가 'UNIX network Programming volume 1, Third Edition'을 읽었습니다. 그리고이 책에서는 데몬 프로그램을 작성하는 예제를 보여줍니다. 예제를 읽은 후 '제어 터미널에서 연결 해제'라는 메시지가 내 코드에서 누락되었습니다.
이제 제 질문은 프로세스를 대몬 화하는 것입니다. 왜 우리가 제어 터미널과의 연결을 끊어야합니까? 그리고 그것은 프로세스의 충돌과 관련이 있습니까? 다른 곳에서 데몬스트레이션을위한 코드가 누락 되었습니까?
감사의 말.
bool daemonize()
{
// http://linux.die.net/man/1/daemonize
// change working dir to root
(void) uchdir("/");
// close stdin, stderr, stdout
if (int fdnull = open("/dev/null", O_RDWR))
{
dup2 (fdnull, STDIN_FILENO);
dup2 (fdnull, STDOUT_FILENO);
dup2 (fdnull, STDERR_FILENO);
close(fdnull);
}
else
{
Log (ERR, "Failed to open /dev/null");
return false;
}
// detach from previous process group
if (setsid() == -1) /* request a new session (job control) */
{
Log (ERR, "Failed to detach from previous process group");
return false;
}
// inhibit others completely and group write
umask(027);
// it's dameonized!
return true;
}
C가 아닙니다. C++과 비슷합니다. 태그를 수정하십시오. 터미널을 닫을 때 터미널에 연결된 모든 프로세스가 SIGHUP 신호를 받으면 터미널과의 연결을 끊습니다. 시그널을 전체 프로세스 그룹에 보낼 수 있기 때문에 새로운 프로세스 그룹 (새 세션)이 시작됩니다. 예를 들어 다중 프로세스 데몬을 알리는 데 매우 유용합니다), 새로운 데몬은 이전 프로세스 그룹과 논리적으로 분리되어 있습니다.) 또한 리눅스 프로세스는 아무 이유없이 충돌하지 않습니다 *. 이유는 항상 존재합니다 : 종료 상태 또는 프로세스가 종료되는 원인이되는 신호. –
비 C 코드 용 C 태그 추가를 중단하십시오! – Olaf
일부 호출을 변경해도 C++ 코드 C 코드가 작성되지 않습니다. 그 중 하나는 C 컴파일러로 컴파일하지 않습니다! 당신의 마음을 확인하십시오! C 컴파일러를 사용하여 C 코드를 컴파일하십시오. C++은 ** 다른 ** 언어입니다! 그래서 당신은 분명히 이것을 컴파일하기 위해 C++ 컴파일러를 사용합니다. – Olaf