如何在守护进程中使用ioctl?

如何在守护进程中使用ioctl?,c,linux,daemon,ioctl,C,Linux,Daemon,Ioctl,我遵循这一点在Linux中创建了一个守护进程。在我开始给ioctl打电话之前,一切都很顺利。似乎对ioctl的任何调用都被完全忽略了。我正在使用ioctl设置终端和键盘模式。下面是示例代码。该代码不作为守护进程运行。我必须做些别的事情才能让ioctl工作吗 int main(int argc,char**argv) { skeleton_daemon();//函数与链接中的函数完全相同 int term=open(“/dev/tty1”,O_RDWR); syslog(LOG_注意,“第一个守护

我遵循这一点在Linux中创建了一个守护进程。在我开始给ioctl打电话之前,一切都很顺利。似乎对ioctl的任何调用都被完全忽略了。我正在使用ioctl设置终端和键盘模式。下面是示例代码。该代码不作为守护进程运行。我必须做些别的事情才能让ioctl工作吗

int main(int argc,char**argv)
{
skeleton_daemon();//函数与链接中的函数完全相同
int term=open(“/dev/tty1”,O_RDWR);
syslog(LOG_注意,“第一个守护进程已启动”);
睡眠(5);
//应该冻结终端和键盘输入,但在作为守护进程运行时不会冻结
ioctl(术语、KDSETMODE、KDU图形);
ioctl(术语,KDSKBMODE,K_OFF);
ioctl(术语0x4B51,1);
睡眠(5);
ioctl(术语、KDSETMODE、KD_文本);
ioctl(术语,KDSKBMODE,previousMode);
ioctl(术语,0x4B51,0);
syslog(LOG_通知,“第一个守护进程终止”);
closelog();
返回退出成功;
}

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


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

正如@Glärbo的回答中所解释的,守护进程没有控制tty。它与它分离。您引用的链接会将其拆离。即使它有一个,这个控制终端也是“/dev/tty”,它是进程控制终端的同义词(不是硬编码值/dev/tty1)。但这就是我重新打开终端的原因。如果我重新打开它,它不应该影响它吗?比如说,如果我使用带有fd的write系统调用,它将作为守护进程写入终端,那么为什么八进制不能工作?@person:“Affect”?这完全取决于你打算做什么。仅当控制台是当前虚拟控制台时,控制台IOCTL才会影响其他内容。如果你看X.org或Wayland,他们要么使用-s开关获取第一个未使用的虚拟终端,要么切换到专用虚拟终端(通常是
/dev/tty7
)。哦,我明白了。ioctl仅在进程控制的终端上工作。省略setsid功能以保留终端可以吗?因为当我这样做的时候,它完全按照我想要的那样工作。@person:不,那是另外一个问题。如果您想要一个终端作为您的控制终端,请使用TIOCSCTTY ioctl(请参见
man 4 tty\u ioctl
)。您需要执行(fork and in the child)setId()以确保当前进程是没有控制终端的新会话的进程组负责人,然后打开tty,并在该tty上使用TIOCSCTTY ioctl使其成为控制终端。对于许多控制台IOCTL,这是不够的,因为特定的虚拟控制台也必须是IOCTL工作的当前控制台。正如我写的,这完全取决于你想做什么。啊,这正是我需要它的原因!