0

我在 linux 的守护进程中使用端口时遇到问题。我使用openfrom fcntl.hlikeserHandle_ = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY);并且在守护进程中使用它时得到0结果。当我在守护程序之外使用它时,一切正常。我已经设置了sudo chmod 666 /dev/ttyUSB0

你知道问题可能是什么吗?也许权限?即使我以超级用户身份启动守护程序,我仍然会0open.

下面你可以看到我的类方法的代码片段,它应该初始化守护进程:

Bool DaemonStarter::initialize()
{
  isInitialized_ = false;
  if (workingDirectory_ == "" ||
      !boost::filesystem3::exists(workingDirectory_))
    return false;

  Bool res = true;
  ::setlogmask(LOG_UPTO(LOG_NOTICE));
  ::openlog(name_.c_str(), LOG_CONS | LOG_NDELAY | LOG_PERROR | LOG_PID, LOG_USER);

  pid_t pid, sid;
  pid = fork();

  if (pid < 0)
  {
    res = res && false;
    ::exit(EXIT_FAILURE);
  }

  if (pid > 0)
  {
    res = res && true;
    ::exit(EXIT_SUCCESS);
  }

  ::umask(0);

  sid = ::setsid();
  if (sid < 0)
  {
    res = res && false;
    ::exit(EXIT_FAILURE);
  }

  if ((chdir(workingDirectory_.c_str())) < 0)
  {
    res = res && false;
    ::exit(EXIT_FAILURE);
  }

  for (UInt i = ::sysconf (_SC_OPEN_MAX); i > 0; i--)
        ::close (i);

  ::umask(0);

  ::close(STDIN_FILENO);
  ::close(STDOUT_FILENO);
  ::close(STDERR_FILENO);
  isInitialized_ = res;
  return res;
}
4

2 回答 2

2

从以下man页面open:“open() 和 creat() 返回新的文件描述符,如果发生错误,则返回 -1”

0是一个完全有效的文件描述符(对于非守护程序应用程序,是您的stdin文件描述符)。如果open失败,它将返回-1,因此您的代码工作正常。

于 2013-07-26T13:21:26.653 回答
1

当您关闭标准文件描述符(stdin/stdout/stderr)时,这些文件描述符可能会被下一次调用重用open。所以open退货0的时候很正常。

如果open会失败,它会返回-1

我建议您 open更仔细地阅读手册页。

于 2013-07-26T13:27:45.843 回答