继续编写简单的linux模块 hello

本文详细介绍如何在Linux内核中使用sched.h头文件获取并打印当前进程ID和命令名,展示模块初始化与卸载函数的正确声明及使用,包括__init与__exit修饰符的应用。通过具体代码示例,深入理解模块生命周期管理。

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

1、通过包含linux/sched.h头文件

#include <linux/sched.h>

可以使用下面的语句打印当前进程的进程 ID 和命令名:

printk(KERN_INFO "The process is \"%s\" (pid %i)\n", current->comm, current->pid);

hello.c

#include <linux/init.h>
#include <linux/module.h>
#include <linux/sched.h>
MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)
{
	printk(KERN_INFO "Hello, world\n");
	printk(KERN_INFO "The process is \"%s\" (pid %i)\n", current->comm, current->pid);

	return 0;
}

static void hello_exit(void)
{
	printk(KERN_INFO "Goodbye, cruel world\n");
}

module_init(hello_init);
module_exit(hello_exit);

编译并安装模块:

make

sudo insmod hello.ko 

dmesg查看打印信息:

[17541.464901] Hello, world
[17541.464903] The process is "insmod" (pid 31411)

2、初始化函数声明中通常使用__init 修饰符,它是一个给内核的暗示,给定的函数只是在初始化使用。 模块加载者在模
块加载后会丢掉这个初始化函数,使它的内存可做其他用途。一个类似的标签(__initdata) 给只在初始化时用的数据。

static int __init initialization_function(void)
{
    /* Initialization code here */
}
module_init(initialization_function);

3、清理函数声明中通常使用__exit 修饰符,标识这个代码是只用于模块卸载( 通过使编译器把它放在特殊的 ELF 段)。 如果你的模块直接建立在内核里,或者如果你的内核配置成不允许模块卸载,标识为 __exit 的函数被简单地丢弃。因为这个原因,一个标识 __exit 的函数只在模块卸载或者系统停止时调用,任何别的使用都是错的。

如果你的模块没有定义一个清理函数,内核不会允许它被卸载。

static void __exit cleanup_function(void)
{
/* Cleanup code here */
}
module_exit(cleanup_function);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值