如何在守护进程中使用 ioctl?
How do I use ioctl in a daemon?
我按照这个 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, KDSETMODE, KD_TEXT);
ioctl(term, KDSKBMODE, previousMode);
ioctl(term, 0x4B51, 0);
syslog(LOG_NOTICE, "First daemon terminated.");
closelog();
return EXIT_SUCCESS;
}
守护进程没有控制终端(或者根本没有 a 终端),并且它们的标准输入通常从 /dev/null
重定向。它们的标准输出和标准错误要么重定向到 /dev/null
,要么重定向到日志文件。
即使守护进程有一个终端,那些 ioctl 也只会影响那个终端,而不会影响其他用户。
我按照这个 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, KDSETMODE, KD_TEXT);
ioctl(term, KDSKBMODE, previousMode);
ioctl(term, 0x4B51, 0);
syslog(LOG_NOTICE, "First daemon terminated.");
closelog();
return EXIT_SUCCESS;
}
守护进程没有控制终端(或者根本没有 a 终端),并且它们的标准输入通常从 /dev/null
重定向。它们的标准输出和标准错误要么重定向到 /dev/null
,要么重定向到日志文件。
即使守护进程有一个终端,那些 ioctl 也只会影响那个终端,而不会影响其他用户。