get_current_tty 使用
get_current_tty 使用
本文程序使用 Linux 4.15.18 内核版本进行测试
在开发内核驱动时,可以使用 get_current_tty
接口获取当前所在的终端,将日志打印到当前终端窗口中。比如,如果我们是通过 SSH 连接到 SSH 服务器上,通过 printk
等内核打印方式打印的日志内容会存储到系统日志中,通过 dmesg
可以查看,不会像用户态程序中库函数 printf
一般将结果打印到当前终端窗口中。此时可以使用 get_current_tty
这一接口获取当前终端,将消息打印到当前终端窗口中。
使用方式如下:
/* #include <linux/tty.h> */
static struct tty_struct *tty;
unsigned char *newLine = "\r\n";
unsigned char *errInfo = "Error: a test error.\r\n";
tty = get_current_tty();
if (tty) {
(tty->driver->ops->write)(tty, newLine, strlen(newLine));
(tty->driver->ops->write)(tty, errInfo, strlen(errInfo));
} else {
printk(KERN_ERR "Get current tty failed\n");
}
需要注意的是,能够使用这个方式打印消息的前提是,驱动进程是由当前终端窗口发起的。如果驱动中使用了工作队列,比如延迟十毫秒启动一个工作线程,那么在这样的线程中调用这个接口将不能够将信息打印到当前控制台上。原因在于,工作队列启动的线程不是由当前终端创建,而是由内核调度创建。若要使用此接口,可以在模块初始化函数中以全局变量的形式,获取到当前 TTY,在工作队列创建的线程中,使用该 TTY 将数据打印到当前 TTY 中。