2013-08-22 3 views
0

У меня есть серверная программа, написанная на C++, которая управляет трафиком между браузером пользователя и аппаратным устройством. Этот сервер работает на моей платформе centos. Когда я запускаю программу, она работает без проблем.C++ daemon server stops

Но попытка запуска программы в качестве демона вызывает некоторые проблемы. Это мой код для демона:

pid_t pid, sid; 

pid = fork(); 
if(pid < 0){ 
    exit(EXIT_FAILURE); 
} 

if(pid > 0) { 
    exit(EXIT_SUCCESS); 
} 

umask(0); 

sid = setsid(); 
if(sid < 0){ 
    exit(EXIT_FAILURE); 
} 

if((chdir("/")) < 0){ 
    exit(EXIT_FAILURE); 
} 

close(STDIN_FILENO); 
close(STDOUT_FILENO); 
close(STDERR_FILENO); 

while(1){ 
    //my program here 
} 

Программа начинается хорошо, это родитель инициализации. Он может работать в течение нескольких часов, но когда я делаю около 10 - 15 запросов, он останавливается.

Я считаю, что код для запуска моей программы в качестве деама правилен. Меня беспокоит мой фактический код. Есть ли какие-то правила, которым я должен следовать? Любое плохое поведение, которого я должен избегать? Любые команды, которые не разрешены с помощью демона, например, вывод командной строки (что я делаю много в данный момент) и т. Д.?

+2

http://stackoverflow.com/questions/3095566/linux-daemonize Я думаю, вам нужно закрыть или перенаправить свои stdout и stderr, или вообще не писать им. Или используйте daemonize или любой другой инструмент для запуска вашей «нормальной» программы в качестве демона. –

+0

Снятие всех выходных данных получило трюк. Теперь все работает нормально. – megadave

ответ

0

Простое закрытие stdout и stderr сделают все записи об ошибках. Я предполагаю, что ваша программа попадает в такую ​​ошибку, обнаруживает ее и завершается. Стандартный метод заключается в том, чтобы открыть /dev/null и dup2(2) до STDOUT_FILENO, STDERR_FILENO и STDIN_FILENO.