簡體   English   中英

使用帶有boost :: asio :: ip :: tcp :: iostream的fork()是否安全?

[英]Is it safe to use fork() with boost::asio::ip::tcp::iostream?

我正在嘗試守護一個簡單的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;
}

我很清楚可能會早期切斷輸入流(似乎循環退出,因為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);
  // ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM