【问题标题】:open() returns error when daemonized守护进程时 open() 返回错误
【发布时间】:2015-02-09 16:06:20
【问题描述】:

在我的情况下,我正在尝试写入帧缓冲区 /dev/fb1。一旦我守护程序,我就没有得到有效的文件描述符。我使用常规文件(具有正确权限)进行了尝试-结果相同。当我注释掉 daemonize();一切正常。

int fbfd;

void initFB()
{
    fbfd = open("/dev/fb1", O_RDWR);
    if (!fbfd) 
    {
        exit(EXIT_FAILURE);
    }
    ...
}

int daemonize()
{
    pid_t pid,sid;
    int lockFile;
    char ProcessID[10];

    pid = fork();
    if (pid < 0)
    {
        exit(EXIT_FAILURE);
    } else if (pid != 0) 
    {
        exit(EXIT_SUCCESS);
    }

    umask(0);

    sid = setsid();
    if(sid < 0)
    {
        exit(EXIT_FAILURE);
    }

    lockFile = open("/var/run/program.pid",O_RDWR|O_CREAT,0640);
    if (lockFile < 0)
    {
        exit(EXIT_FAILURE);
    }
    if (lockf(lockFile,F_TLOCK,0)<0)
    {
        exit(EXIT_SUCCESS);
    }

    sprintf(ProcessID,"%d\n",getpid());
    write(lockFile,ProcessID,strlen(ProcessID));

    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);
    signal(SIGCHLD,SIG_IGN);
    signal(SIGTSTP,SIG_IGN);
    signal(SIGTTOU,SIG_IGN);
    signal(SIGTTIN,SIG_IGN);
    signal(SIGHUP,signal_handler);
    signal(SIGTERM,signal_handler);

   return(1);
}


int main(int argc,char **argv)
{
    daemonize();
    initFB();
    ...
}

【问题讨论】:

    标签: c linux daemon


    【解决方案1】:

    您对open() 结果的检查不正确。失败时,open() 返回 -1,而不是 0。在您的情况下,发生这种情况是因为open() 最终会得到最低的可用文件描述符,这里是0,因为您已经关闭了stdin

    【讨论】:

    • 非常感谢。我已经改变了它并且它有效。它还解释了为什么“errno”检查会给出“成功”。有道理。
    【解决方案2】:

    嗯,那是因为 open() 返回零。 我怀疑这是您的守护进程获得的第一个文件描述符。

    它将为零。

    【讨论】:

    • 感谢您的回答。如上所述,这确实是解决方案。
    猜你喜欢
    • 2014-08-29
    • 2011-07-20
    • 2023-03-19
    • 2023-01-29
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    相关资源
    最近更新 更多