问题描述
我按照这个 link 在 Linux 中创建了一个守护进程。它运行良好,直到我开始调用 ioctl。似乎对 ioctl 的任何调用都被完全忽略了。我正在使用 ioctl 来设置终端和键盘模式。示例代码如下。该代码无需将其作为守护程序运行即可工作。我是否必须做其他事情才能使 ioctl 正常工作?
int main(int argc,char **argv)
{
skeleton_daemon(); // Function is the exact same as in the link
int term = open("/dev/tty1",O_RDWR);
syslog(LOG_NOTICE,"First daemon started.");
sleep(5);
// Should freeze the terminal and keyboard input but doesn't when running as daemon
ioctl(term,KDSETMODE,KD_GRAPHICS);
ioctl(term,KDSKBMODE,K_OFF);
ioctl(term,0x4B51,1);
sleep(5);
ioctl(term,KD_TEXT);
ioctl(term,prevIoUsMode);
ioctl(term,0);
syslog(LOG_NOTICE,"First daemon terminated.");
closelog();
return EXIT_SUCCESS;
}
解决方法
守护进程没有控制终端(或根本没有a终端),并且通常从 /dev/null
重定向其标准输入。它们的标准输出和标准错误要么重定向到 /dev/null
,要么重定向到日志文件。
即使守护进程有终端,这些 ioctl 也只会影响该终端,而不影响其他用户。