-------------------------------source---------------------------------
#include <linux/module.h>
#include <linux/kernel.h>#include <linux/init.h>#include <linux/sched.h>#include <linux/tty.h>/* 函数声明 */void tty_write_message1(struct tty_struct *, char * );/* 初始化函数 */static int my_init( void ){ char *msg = "Hello tty!\n"; printk( "hello, from the kernel...\n" ); if( current != NULL ) printk( "pid(command) = %d(%s) \n", current->pid, current->comm );}
/* 清理函数 */
static void my_cleanup( void ){ printk( "Goodbye, from the kernel ...\n" );}module_init( my_init );module_exit( my_cleanup );// this routine was borrowed from <printk.c> void tty_write_message1( struct tty_struct *tty, char *msg ){ if( tty && tty->driver && tty->driver->ops && tty->driver->ops->write ) tty->driver->ops->write( tty, msg, strlen( msg) );// 写tty
return ;}------------------------------output---------------------
$ sudo insmod currentptr.ko
Hello tty!
[ 1029.174761] hello, from the kernel...
[ 1029.174777] pid(command) = 2726(insmod) [ 1029.174780] parent pid = 2725(sudo) [ 1029.174782] parent parent pid = 7556(bash) [ 1029.174784] parent parent parent pid = 7529(gnome-terminal)
----------------------------------------------------------------------------------------
在linux的内核的世界里, 有了current的个宏, 就可以去探索进程相关的代码
如: 打印进程列表
struct task_struct *task
for_each_process(task)
{ printk( KERN_WARNING "%8d%8ld%8d%s\n", task->pid, task->state, task->on_cpu, task->comm ); }
---------------------------------------
[ 2597.598496] 1 1 0 init
[ 2597.598499] 2 1 0 kthreadd[ 2597.598501] 3 1 0 ksoftirqd/0[ 2597.598503] 6 1 0 migration/0[ 2597.598506] 7 1 0 watchdog/0[ 2597.598508] 8 1 0 migration/1
task_struct 是进程结构 这个结构的大小 大约是4k的大小 可见一个进程的结构关联了很多的信息, 而且这个结构中有大量的指针,
0008 struct ;0009 0010 (struct *, );0011 0012 static struct *(void)0013 {0014 return ();0015 }0016 0017 #define () 如果给current赋值的话 current = NULL; lvalue required as left operand of assignment 可以current 不是一个变量 在多核系统中怎么保证current 不会指向其他核上的宏呢 根据, 就可有知道一些信息