2015-04-27 49 views
0

基於Libmongoose的服務器在終端上的Windows以及服務中運行良好。Linux守護進程 - 運行兩次功能

現在,我將它移植到Linux。在終端中運行時它是完美的。現在,我想把它作爲一個守護進程運行 - 它的工作原理,但令我驚訝的是它調用了所有的功能兩次。我檢查了PID,只有一個進程正在運行。這讓我瘋狂。的daemonizing代碼如下:

if(CommandArgs.at("-d") == "true") 
{ 
    #if __linux 
    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); 
    } 
    /* Change the current working directory */ 
    if ((chdir("/")) < 0) { 
     exit(EXIT_FAILURE); 
    } 

    /* Close out the standard file descriptors */ 
    close(STDIN_FILENO); 
    close(STDOUT_FILENO); 
    close(STDERR_FILENO); 
    if(start_server() == false) 
    { 
     exit(EXIT_FAILURE); 
    } 
    else 
    { 
     signal(SIGHUP, signal_handler); 
     signal(SIGTERM, signal_handler); 
     signal(SIGINT, signal_handler); 
     signal(SIGQUIT, signal_handler); 
     pause(); 
    } 
    //exit(EXIT_SUCCESS); 
    return 0; 
    #endif 
} 

現在,i之後調用內部的start_server()功能-functions被調用兩次:

static bool start_server() 
{ 
    try{ 
     // invoked once as expected 
     MyLogger(2, "Info: Starting Server ..."); 

     #ifdef _WIN32 
     mutex = CreateMutex(NULL, FALSE, NULL); 
     #else 
     pthread_mutex_init(&mutex, NULL); 
       #endif 

     for(int i = 0; i < serverConf.totalThreads; i++) 
     {  
         server[i] = mg_create_server(NULL, event_handler); 
      if(i==0) 
      { 
       const char * error_msg = mg_set_option(server[0], "listening_port", serverConf.port.c_str()); 
       if (error_msg != NULL) { 
        MyLogger(1,"Error: Cannot bind to the port:",serverConf.port.c_str()); 
        return false; 
       } 
      } 
      else 
      { 
       mg_copy_listeners(server[0], server[i]); 
         } 
     } 
     // Now all the logging happening twice 
     ServerStarted = true; 
     for(int i = 0; i < serverConf.totalThreads; i++) 
     { 
      mg_start_thread(serve, server[i]); 
     } 
     // server1 goes to separate thread, server 2 runs in main thread. 
     // IMPORTANT: NEVER LET DIFFERENT THREADS HANDLE THE SAME SERVER. 

     MyLogger(2, "Info: Server Started!"); // why was i logged twice 
     MyLogger(2, "Info: Listening on port:", mg_get_option(server[0], "listening_port")); // why was i logged twice 

    } 
    catch(std::exception& e) 
    { 
     return false; 
    } 
    return true; 
} 

現在日誌:

2015年4月27日,23:06:39信息:啓動服務器..

2015-04-27,23:06:41信息:Server Started!

2015-04-27,23:06:41信息:Server Started!

2015年4月27日,23時06分41秒的信息:偵聽端口:8091

2015年4月27日,23時06分41秒的信息:偵聽端口:8091

void MyLogger(int level, const char* msg1) 
{ 
    if(level > LogLevel) 
    { 
     return; 
    } 
    string time = currentDateTime(); 
    std::ofstream out(LogFilePath.c_str(), std::fstream::app); 
     if(silentMode == false) 
    { 
     cout<<"\n"<<time<<" "<<msg1<<"\n"; 
    } 
    out<<"\n"<<time<<" "<<msg1<<"\n"; 

} 
+0

;永不比較==真;因爲'真'可能是最不重要的任何值,而不是0而是比較!= false或甚至更好:'if(CommandArgs.at(「 - d」))' – user3629249

+0

您應該熟悉的最小示例在哪裏? –

+0

在編寫代碼時,總是使用空格進行縮進,而不是製表符發佈的代碼清楚地顯示了爲什麼製表符永遠不會用於縮進。 – user3629249

回答

1

消息似乎可能被函數MyLogger()複製。如果silentMode == false,它將打印相同的消息到兩個流,但它們實際上可能是流相同的流,否則兩者的輸出可能最終重定向到相同的地方。

這可能會開始發生,你說,它如果功能 mg_create_server()一個,mg_set_option(),或mg_copy_listeners()修改out,設置silentModefalse,或以其他方式使得這會產生這樣的結果發生變化。

+0

你說得對cout解決了問題。萬分感謝! –