2016-09-11 15 views
-1

[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; 
} 
+0

C가 아닙니다. C++과 비슷합니다. 태그를 수정하십시오. 터미널을 닫을 때 터미널에 연결된 모든 프로세스가 SIGHUP 신호를 받으면 터미널과의 연결을 끊습니다. 시그널을 전체 프로세스 그룹에 보낼 수 있기 때문에 새로운 프로세스 그룹 (새 세션)이 시작됩니다. 예를 들어 다중 프로세스 데몬을 알리는 데 매우 유용합니다), 새로운 데몬은 이전 프로세스 그룹과 논리적으로 분리되어 있습니다.) 또한 리눅스 프로세스는 아무 이유없이 충돌하지 않습니다 *. 이유는 항상 존재합니다 : 종료 상태 또는 프로세스가 종료되는 원인이되는 신호. –

+0

비 C 코드 용 C 태그 추가를 중단하십시오! – Olaf

+0

일부 호출을 변경해도 C++ 코드 C 코드가 작성되지 않습니다. 그 중 하나는 C 컴파일러로 컴파일하지 않습니다! 당신의 마음을 확인하십시오! C 컴파일러를 사용하여 C 코드를 컴파일하십시오. C++은 ** 다른 ** 언어입니다! 그래서 당신은 분명히 이것을 컴파일하기 위해 C++ 컴파일러를 사용합니다. – Olaf

답변

3

C 또는 C++ 프로그램을 deamonize하는 기본 단계는 것은 이미이 질문에 언급 된 : 여기

내 코드입니다 Creating a daemon in Linux

예, 문제는 C에 대한 아니라 거기에 있었다 C++이지만, 시스템 호출은 프로그램을 대몬 화해야하기 때문에 두 경우 모두 C 함수이므로 실제로는 차이가 없습니다.

1

내가 [ http://linux.die.net/man/1/daemonize][1]의 안내에 따라 리눅스에서 데몬 프로그램을 작성 ... 실제 문제를 해결하지만

하지 마십시오!

daemon -ize는 현명한 init 시스템 및 서비스 추적 프로그램의 취약점입니다. 문제는 프로그램이 제어 터미널과 부모 프로세스로부터 분리 된 후에 프로그램이 상태를 추적하고 제어권을 회복하기 어렵다는 것입니다. PID 파일을 사용하는 일반적인 방법은 경쟁 조건이 발생하기 쉽기 때문에 그러한 프로세스를 자동으로 다시 생성하려는 의도라면 특히 바람직하지 않습니다.

daemon을 사용하면 몇 가지 해킹이 생겼다. 어떤 종류는 괜찮지 만보기 흉하게도 괜찮 았지만 아무 것도 아름답지는 않았다. 자신과 세계의 다른 사람들을 부탁하고 프로그램을 대몬으로하지 마십시오.