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);