Перерегистрация epoll: файл существует - PullRequest
0 голосов
/ 24 мая 2011

У меня есть это исключение, которое происходит на стороне сервера (многопроцессорный сервер с fork ()), когда я пытаюсь переподключить клиента сразу после отключения. Я использую boost, но в настоящее время я не совсем понимаю инструкцию, которая выдает исключение, потому что отладка в многопроцессорном режиме не просто для меня.

Однако я полагаю, что на данный момент:

io_service_.notify_fork(boost::asio::io_service::fork_child);

Есть идеи?

Обновление

Я использую версию 1.52 asio, поэтому она поддерживает форк, и исключение находится в дочернем процессе. Это происходит при третьей попытке переподключения, поэтому, если

  1. Подключить клиента
  2. Отключить (принудительно, нажав Ctrl + C)
  3. Переподключение (все работы)
  4. Disconnect
  5. Повторное подключение этого клиента (или другого клиента) вызывает исключение ..

Это код:

   if (fork() == 0)  //I'm child process
   {
      io_service_.notify_fork(boost::asio::io_service::fork_prepare);

     cout << "I'm child process and my PID is " << getpid() << endl;

/*Notifies to the io_service_  the fork termination*/

try
{
  io_service_.notify_fork(boost::asio::io_service::fork_child);
}
catch (boost::exception& e)
       {                                                           cout<<"Exception in notify_fork child "<< endl;
std::cerr << diagnostic_information(e) << std::endl;
}

   /*Closes the listen socket which remains opened in the parent process to      accept new connections*/

acceptor_.close();
}
  else //I'm the parent process
  {
  cout << "I'm the parent process and my PID is " << getpid() << endl;

  /*Notifies to the io_service_  the fork termination*/

  try
  {
  io_service_.notify_fork(boost::asio::io_service::fork_parent);
  }
  catch (boost::exception& e)
  {
  cout<<"Exception in notify_fork parent "<< endl;
  std::cerr << diagnostic_information(e) << std::endl;
  }
      socket_.close();

      /*Listening to new connections*/

  start_accept();
 }
...