[英]Linux Daemon - runs functions twice
我的基於Libmongoose的服務器在Windows終端和服務中運行良好。
現在,我將其移植到Linux。 在終端中運行時,它可以完美工作。 現在,我想將其作為守護程序運行-它可以工作,但令我驚訝的是,它兩次調用了所有功能。 我檢查了PID,只有一個進程正在運行。 這讓我瘋狂。 守護程序代碼如下:
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
}
現在,在我調用start_server()
函數之后,內部的函數被調用了兩次:
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-04-27,23:06:39信息:正在啟動服務器..
2015-04-27,23:06:41信息:服務器啟動!
2015-04-27,23:06:41信息:服務器啟動!
2015-04-27,23:06:41信息:在港口上監聽:8091
2015-04-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";
}
消息似乎由函數MyLogger()
復制。 如果silentMode == false
,它將向兩個流打印相同的消息,但實際上它們可能是相同的流,否則,兩者的輸出最終可能會重定向到同一位置。
如果您將函數mg_create_server()
, mg_set_option()
或mg_copy_listeners()
修改out
,將silentMode
設置為false
或進行更改以產生這樣的結果,則可能會從您說的做開始。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.