gpt4 book ai didi

c++ - Linux 守护进程 - 运行函数两次

转载 作者:太空宇宙 更新时间:2023-11-04 10:53:16 24 4
gpt4 key购买 nike

我的基于 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,设置 silentModefalse,或以其他方式进行会产生此类结果的更改。

关于c++ - Linux 守护进程 - 运行函数两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29902775/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com