2013-07-26 34 views
0

我在使用Linux守护进程中的端口时遇到问题。 我使用openfcntl.hserHandle_ = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY);和我得到0结果当我在一个守护进程中使用它。当我在守护进程外使用它时,一切正常。我已经设置了sudo chmod 666 /dev/ttyUSB0无法在守护进程中打开ttyUSB端口

你有一些想法可能是什么问题?也许权限?即使我以超级用户身份启动守护进程,我仍然从open得到0

下面你可以看到我的类方法的代码片断应该初始化进程:

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; 
} 
+0

演示此问题的最小代码示例可能非常有用。 – hetepeperfan

+1

在守护进程中,标准输入和输出描述符(stdin/stdout)是否关闭? –

+0

添加了代码片段。 – DBPST

回答

1

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

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

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

+0

谢谢!我认为0是一个错误:) – DBPST

2

manopen:“open()和科瑞()返回新的文件描述符,或-1如果发生错误“

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

+0

哦!非常感谢你!我以为0是一个错误:/ – DBPST