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

第四章 实验课 中断和异常管理

一、任务1:使用tasklet实现打印helloworld(20min)

1、任务描述

编写内核模块,使用tasklet实现打印helloworld。
加载、卸载模块并查看模块打印信息。

2、实验过程

tasklet_interrupt.c文件

#include <linux/module.h> #include <linux/interrupt.h> MODULE_LICENSE("GPL"); static struct tasklet_struct my_tasklet; static void tasklet_handler(unsigned long data) { printk("Hello World! tasklet is working...\n"); } static int __init mytasklet_init(void) { printk("Start tasklet module...\n"); tasklet_init(&my_tasklet, tasklet_handler, 0); tasklet_schedule(&my_tasklet); return 0; } static void __exit mytasklet_exit(void) { tasklet_kill(&my_tasklet); printk("Exit tasklet module...\n"); } module_init(mytasklet_init); module_exit(mytasklet_exit);


Makefile文件

ifneq ($(KERNELRELEASE),) obj-m := tasklet_interrupt.o else KERNELDIR ?= /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules endif .PHONY:clean clean: -rm *.mod.c *.o *.order *.symvers *.ko


编写好上述文件

内核模块加载结果:

二、任务2:用工作队列实现周期打印helloworld(25min)

1、任务描述

编写一个内核模块程序,用工作队列实现周期打印helloworld。
加载、卸载模块并查看模块打印信息。

2、实验过程

workqueue_test.c文件

#include <linux/module.h> #include <linux/workqueue.h> #include <linux/delay.h> MODULE_LICENSE("GPL"); static struct workqueue_struct *queue = NULL; static struct delayed_work mywork; static int i = 0; void work_handle(struct work_struct *work) { printk(KERN_ALERT "Hello World!\n"); } static int __init timewq_init(void) { printk(KERN_ALERT "Start workqueue_test module."); queue = create_singlethread_workqueue("workqueue_test"); if(queue == NULL){ printk(KERN_ALERT "Failed to create workqueue_test!\n"); return -1; } INIT_DELAYED_WORK(&mywork, work_handle); for(;i <= 3; i++){ queue_delayed_work(queue, &mywork, 5 * HZ); ssleep(15); } return 0; } static void __exit timewq_exit(void) { flush_workqueue(queue); destroy_workqueue(queue); printk(KERN_ALERT "Exit workqueue_test module."); } module_init(timewq_init); module_exit(timewq_exit);


Makefile文件

ifneq ($(KERNELRELEASE),) obj-m := workqueue_test.o else KERNELDIR ?= /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules endif .PHONY:clean clean: -rm *.mod.c *.o *.order *.symvers *.ko


编写好上述文件

内核模块加载结果:

由代码逻辑知:工作队列延时 5*HZ(5秒)开始执行,对应上图中模块加载后5秒才打印HelloWorld!;而后每次执行工作队列中间休眠15秒,与上图对应。

三、任务3:编写一个信号捕获程序,捕获终端按键信号(25min)

1、任务描述

在用户态编写一个信号捕获程序,捕获终端按键信号(包括ctrl+c、ctrl+z、ctrl+\)。
编译上述程序后运行,在终端输入按键信号(ctrl+c、ctrl+z、ctrl+\),查看输出信息。

2、实验过程

catch_signal.c文件

#include <signal.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> void signal_handler(int sig) { switch(sig){ case SIGINT: printf("\nGet a signal:SIGINT. You pressed ctrl+c.\n"); break; case SIGQUIT: printf("\nGet a signal:SIGQUIT. You pressed ctrl+\\.\n"); break; case SIGTSTP: printf("\nGet a signal:SIGHUP. You pressed ctrl+z.\n"); break; } exit(0); } int main() { printf("Current process ID is %d\n", getpid()); signal(SIGINT, signal_handler); signal(SIGQUIT, signal_handler); signal(SIGTSTP, signal_handler); for(;;); }

运行结果:

http://www.cnnetsun.cn/news/85002.html

相关文章:

  • 传统vsAI:tiptap项目开发效率对比实验
  • 传统调试 vs AI辅助:连接问题解决效率对比
  • AI如何帮你轻松实现循环队列?快马平台一键生成代码
  • 电商项目中遇到的自动配置排除实战案例
  • 架构之复杂对象存储
  • 快速验证防火墙规则:firewall-cmd沙盒环境搭建
  • 真实案例:解决‘Not a Genuine ST Device‘的5种方法
  • 如何用AI自动诊断和修复Gradle构建失败问题
  • AI如何帮你一键卸载Office?快马平台自动生成卸载工具
  • 1小时打造VC++运行时检测工具原型
  • LangGraph之工具调用 (ToolNode) 扩展智能体的能力边界
  • 3分钟解决‘npm问题‘:比传统方法快10倍的AI方案
  • 详解transformer模型详解背后的算力支撑:GPU+TensorFlow+清华源
  • Anything-LLM支持哪些开源模型?Ollama兼容性深度测评
  • 17c.100.cv在实际项目中的应用案例
  • AI如何助力达梦数据库开发效率提升
  • vLLM部署Qwen3-8B:高效推理与PagedAttention优化
  • 告别手动配置:firewall-cmd高效管理技巧大全
  • java代码审计 || 第一章~第三章
  • Qwen3-14B-AWQ部署指南:本地到云端全流程
  • 企业级Java开发环境配置最佳实践
  • 为什么工业RLHF成败不取决于PPO/DPO/GRPO?构建评估体系才是核心难点!
  • Qwen3-32B真实压力测试:企业级长文本推理可行吗?
  • 通义深度搜索-操作指南
  • AI如何自动修复VC++运行时缺失问题
  • Qwen3-14B本地部署指南:Ubuntu一键启动AI服务
  • 图解K8s部署可用性问题:从报错到解决的完整指南
  • WPS 助力制造行业打造统一、安全、高效的协同办公平台
  • Kotaemon开源RAG框架与混合检索解析
  • FaceFusion人脸掩码配置:遮挡器与解析器详解