当前位置: 首页 > news >正文

Linux下类FreeBSD uprintf实现

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

相关文章:

  • ubuntu配置ssh服务
  • 软件项目一直赶工期,越改越忙,怎么破?
  • 迁移Blog平台
  • 使用Python face_recognition 人脸识别 - 1
  • 《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之12---BREW里面有什么...
  • 使用Python face_recognition 人脸识别 - 2 人脸1-1比对
  • SUBMIT 的使用方法...
  • 《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之13---BREW精要之COM 模型...
  • 使用Python face_recognition 人脸识别 - 5 人脸比对并打分
  • 天翼3G终端四大思路存疑
  • 使用Python face_recognition 人脸识别 - 6 从webcam中获取人脸
  • 使用Python face_recognition 人脸识别 - 7 使用knn分类器
  • ubuntu 使用gspca安装摄像头
  • 使用Python face_recognition 人脸识别 - 8 判断一张照片中是否存在人脸
  • 嵌入式系统软件的全过程质量保证
  • ➹使用webpack配置多页面应用(MPA)
  • 2017 年终总结 —— 在路上
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • java8-模拟hadoop
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • Python学习之路13-记分
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • TypeScript实现数据结构(一)栈,队列,链表
  • ubuntu 下nginx安装 并支持https协议
  • Vue.js源码(2):初探List Rendering
  • 关于Java中分层中遇到的一些问题
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 我从编程教室毕业
  • 线性表及其算法(java实现)
  • ionic入门之数据绑定显示-1
  • Spring第一个helloWorld
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​马来语翻译中文去哪比较好?
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (二)构建dubbo分布式平台-平台功能导图
  • (规划)24届春招和25届暑假实习路线准备规划
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (三分钟)速览传统边缘检测算子
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • .NET 服务 ServiceController
  • @Autowired和@Resource装配
  • [ 第一章] JavaScript 简史
  • []sim300 GPRS数据收发程序
  • []新浪博客如何插入代码(其他博客应该也可以)
  • [Assignment] C++1
  • [c#基础]DataTable的Select方法
  • [C++ 从入门到精通] 12.重载运算符、赋值运算符重载、析构函数
  • [CISCN2019 华北赛区 Day1 Web2]ikun
  • [CSS]CSS 的背景
  • [GN] 设计模式——面向对象设计原则概述