2015-02-09 34 views
1

在我的情况下,我试图写入帧缓冲区/ dev/fb1。只要我守护程序,我就没有有效的文件描述符。我用一个普通的文件(具有正确的权限)尝试它 - 相同的结果。当我注释掉daemonize();一切运行良好。open()在守护进程时返回错误

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(); 
    ... 
} 

回答

2

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

+0

非常感谢。我改变了这一点,它的工作原理。这也解释了为什么'errno'检查给了'成功'。说得通。 – awado 2015-02-10 10:11:44

1

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

它将为零。

+0

谢谢你的回答。如上所述,这确实是解决方案。 – awado 2015-02-10 10:12:54