hyd*_*dic 6 c++ posix fork boost-asio c++11
我正在尝试守护一个简单的TCP客户端,虽然客户端在前台工作得很好,但守护它会导致奇怪的行为.
作为一个测试案例,我有一台服务器,一旦你连接并发送一条消息("已连接"),它将向你发送每秒连接一次的秒数.
如果我守护进程(通过调用Test::Connect(true)),即使在成功接收到一些数字之后,连接也会在任意时间后下降.
如果我没有守护进程(通过调用Test::Connect(false)),连接保持活动状态,我会继续按预期接收数字.
#include <string>
#include <iostream>
#include <boost/asio.hpp>
#include <unistd.h>
class Test
{
public:
Test()
{
io = nullptr;
}
void Connect(bool daemonize)
{
io = new boost::asio::ip::tcp::iostream("localhost", "6500");
if ( io && *io )
{
*io << "connected" << std::endl;
if ( daemonize )
{
pid_t child = fork();
if ( child < 0 ) exit(EXIT_FAILURE);
else if ( child > 0 ) exit(EXIT_SUCCESS);
umask(0);
if ( setsid() < 0 ) exit(EXIT_FAILURE);
if ( chdir("/tmp") < 0 ) exit(EXIT_FAILURE);
child = fork();
if ( child < 0 ) exit(EXIT_FAILURE);
else if ( child > 0 ) exit(EXIT_SUCCESS);
}
std::string line;
while ( *io )
{
std::getline(*io, line);
std::cout << "Line (" << line.length() << "): " << line << std::endl;
}
}
delete io;
io = nullptr;
}
private:
boost::asio::ip::tcp::iostream *io;
}
Run Code Online (Sandbox Code Playgroud)
我对于什么可能提前切断输入流感到困惑(似乎循环退出是因为io->eof() == true这样(bool)*io == false).因为这只是在尝试守护时发生的,我应该完全避免分叉吗?有没有更好的方法以编程方式将进程发送到后台(仅使用C/C++代码)?
我不确定这是否相关,但是您需要notify_fork在这里打电话吗,例如:
boost::asio::io_service io_service;
// ...
if ( daemonize )
{
io_service.notify_fork(boost::asio::io_service::fork_prepare);
pid_t child = fork();
if (child == 0) io_service.notify_fork(boost::asio::io_service::fork_child);
else io_service.notify_fork(boost::asio::io_service::fork_parent);
// ...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
446 次 |
| 最近记录: |