2014-10-10 3 views
0

Я создал демон для Linux в C++, однако дочерний процесс, похоже, ничего не делает. Как только он достигает инструкции if (pid> 0), все, кажется, прекращается. Код для Daemon.Start() выглядит следующим образом:Linux Daemon не работает

//Process ID and Session ID 
pid_t pid,sid; 

//Fork off the Parent Process 
pid = fork(); 
if(pid < 0) 
    exit(EXIT_FAILURE); 
//If PID is good, then exit the Parent Process 
if(pid > 0) 
    exit(EXIT_SUCCESS); 

//Change the file mode mask 
umask(0); 

//Create a new SID for the Child Process 
sid = setsid(); 
if(sid < 0) 
{ 
    exit(EXIT_FAILURE); 
} 

//Change the current working directory 
if((chdir("/")) < 0) 
{ 
    //Log the failure 
    exit(EXIT_FAILURE); 
} 

//Close out the standard file descriptors 
close(STDIN_FILENO); 
close(STDOUT_FILENO); 
close(STDERR_FILENO); 

//The main loop. 
Globals::LogError("Service started."); 
while(true) 
{ 
    //The Service task 
    Globals::LogError("Service working."); 
    if(!SystemConfiguration::IsFirstRun() && !SystemConfiguration::GetMediaUpdateReady()) 
    { 
     SyncServer(); 
    } 
    sleep(SystemConfiguration::GetServerConnectionFrequency()); //Wait 30 seconds 

} 

exit(EXIT_SUCCESS); 

Любая помощь будет здорово! :)

+0

Используйте библиотеку или скрипт, чтобы делать подобные вещи, не нужно изобретать это колесо. –

+0

Просто поместите fprintf на stderr, чтобы узнать, где находится дочерний процесс. – Claudio

ответ

1

Я уверен, что ваш дочерний процесс умирает либо в sid < 0, либо в инструкции chdir("/") < 0 if. Написать в стандартный вывод в этих случаях перед выходом, чтобы показать, что проблема:

//Create a new SID for the Child Process 
sid = setsid(); 
if(sid < 0) 
{ 
    fprintf(stderr,"Failed to create SID: %s\n",strerror(errno)); 
    exit(EXIT_FAILURE); 
} 

//Change the current working directory 
int chdir_rv = chdir("/"); 
if(chdir_rv < 0) 
{ 
    fprintf(stderr,"Failed to chdir: %s\n",strerror(errno)); 
    exit(EXIT_FAILURE); 
} 

Вам нужно включить <errno.h> и <string.h> для того, чтобы иметь ERRNO и strerror определены (соответственно).

С уважением

+0

Я пробовал это, и все равно не повезло. – GenericMadman

+0

страшный рассказ ... что произойдет, если вы закомментируете все, что связано с fork (сам вызов и проверки относительно переменной pid)? –

+0

«Не удалось создать SID: -1». – GenericMadman

Смежные вопросы