Linux下类FreeBSD uprintf实现

本文介绍了一个名为uprintf的函数,在FreeBSD中用于将内核信息输出到当前的tty供用户查看。由于Linux缺少类似功能,文章提供了一种通过借用tty设备实现类似功能的方法,并给出了具体的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

uprintf是FreeBSD下内核函数, 作用是将内核信息输出到当前的tty给用户显示, 非常方便. 而linux下无此函数, 不过可以通过借用tty设备来达到目的.

以下是代码实现.

Kernel version: 2.6.28

gcc Version: 4.3.3

#include <linux/module.h> /* Needed by all modules */ #include <linux/kernel.h> /* Needed for KERN_INFO */ #include <linux/init.h> #include <linux/syscalls.h> #include <linux/unistd.h> #include <linux/sched.h> /* For current */ #include <linux/tty.h> /* For the tty declarations */ static void tty_print(const char *str) { struct tty_struct *cur_tty; // 取得当前的tty if ( current->signal ) cur_tty = current->signal->tty; else cur_tty = NULL; // 调用当前tty设备驱动write操作 if ( cur_tty ) { if ( cur_tty->driver ) { cur_tty->driver->ops->write( cur_tty, str, strlen( str ) ); /* cur_tty->driver->ops->write( cur_tty, "\015\012", 2 ); */ } } } int uprintf(const char *fmt, ...) { char printf_buf[1024]; va_list args; int printed; va_start(args, fmt); printed = vsprintf(printf_buf, fmt, args); va_end(args); tty_print( printf_buf ); return 0; } EXPORT_SYMBOL( uprintf ); static int __init uprintf_init(void) { uprintf( "hello init\n" ); return 0; } static void __exit uprintf_fini(void) { uprintf( "hello end\n" ); } module_init(uprintf_init); module_exit(uprintf_fini);

Makefile

obj-m = uprintf.o uprintf-objs = main.o KVERSION = $(shell uname -r) all: make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules clean: make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean rm -f Module.markers modules.order

参考:

Replacing printk's

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值