Linux 守护进程 - 运行函数两次
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
,或以其他方式进行更改以产生这样的结果。
相关文章:
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- C++析构函数调用两次,堆栈分配的复合对象
- C++两次定义相同的函数会导致错误
- 对于优化级别为 0 的 std::vector,析构函数被调用两次
- 为什么转换运算符调用复制构造函数两次,而等效函数只调用它一次
- 调用一个小函数两次(例如在if条件和主体中)比将结果存储在局部变量中更可取
- 为什么这个自定义分配器的析构函数在 GCC/MSVS 的 stdlib 中被调用两次
- 调用某个回调函数两次会导致分段错误:Nan
- C++:链接库两次,全局构造函数运行两次吗?
- 执行函数两次
- 重载运算符 new(),为什么构造函数被调用两次?
- 带有文件结束函数的 while 循环重复输出文件中的最后一个数字两次
- 为同一存储位置调用构造函数两次是否合法?
- 为什么在下面的代码中调用复制构造函数两次
- 两个单链列表共享同一个节点和析构函数两次删除相同的内存
- 析构函数在 lambda 捕获说明符中声明的类实例上运行两次
- 为什么在这里调用析构函数两次
- while 循环在一个函数调用中执行两次
- 为什么这个构造函数被调用两次
- 用define替换两次函数调用