open() returns 守护进程时出错
open() returns error when daemonized
在我的例子中,我正在尝试写入帧缓冲区 /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();
...
}
您对 open()
的检查结果不正确。失败时,open()
returns -1
,而不是 0
。在您的情况下,发生这种情况是因为 open()
将以最低的可用文件描述符结束,这里是 0
,因为您关闭了 stdin
.
嗯,那是因为 open() returns 为零。
我怀疑这是您的守护进程获得的第一个文件描述符。
它将为零。
在我的例子中,我正在尝试写入帧缓冲区 /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();
...
}
您对 open()
的检查结果不正确。失败时,open()
returns -1
,而不是 0
。在您的情况下,发生这种情况是因为 open()
将以最低的可用文件描述符结束,这里是 0
,因为您关闭了 stdin
.
嗯,那是因为 open() returns 为零。 我怀疑这是您的守护进程获得的第一个文件描述符。
它将为零。