如何在守护进程中使用 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,KD_TEXT);
    ioctl(term,prevIoUsMode);
    ioctl(term,0);

    syslog(LOG_NOTICE,"First daemon terminated.");
    closelog();
    return EXIT_SUCCESS;
}

解决方法

守护进程没有控制终端(或根本没有a终端),并且通常从 /dev/null 重定向其标准输入。它们的标准输出和标准错误要么重定向到 /dev/null,要么重定向到日志文件。

即使守护进程有终端,这些 ioctl 也只会影响该终端,而不影响其他用户。