转自:https://blog.csdn.net/Tryantking/article/details/80027214

一、打印系统中所有内核线程的程序名、PID 号、进程状态及进程优先级、父进程的PID

1、首先,我们开始编写模块代码pPid.c,这是Linux内核编程的核心代码,代码如下:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/init_task.h>
// 初始化函数
static int hello_init(void)
{struct task_struct *p;p = NULL;p = &init_task;printk(KERN_ALERT"名称\t进程号\t状态\t优先级\t父进程号\t");for_each_process(p){if(p->mm == NULL){ //内核线程的mm成员为空printk(KERN_ALERT"%s\t%d\t%ld\t%d\n",p->comm,p->pid, p->state,p->normal_prio,p->parent->pid);}}return 0;
}
// 清理函数
static void hello_exit(void)
{printk(KERN_ALERT"goodbye!\n");
}// 函数注册
module_init(hello_init);
module_exit(hello_exit);  // 模块许可申明
MODULE_LICENSE("GPL");

2、头文件的声明,module.h包含了大量加载模块所需要的函数和符号的定义;init.h包含了模块初始化和清理函数的定义。如果模块加载时允许用户传递参数,模块还应该包含moduleparam.h头文件。

3、接下来我们需要初始化函数,task_struct 结构定义在/usr/src/linux4.4.19/include/linux/sched.h 中,所以也需要在头文件加入这个库,而这个结构也包含了我们需要使用的PID之类的值,可以直接调用。当然了,这两篇文章可以更好理解这个结构:

https://blog.csdn.net/npy_lp/article/details/7292563

https://blog.csdn.net/npy_lp/article/details/7335187

接下来,我们需要对我们定义的结构p初始化指针,否则会产生也指针,文件也会报错,因此,我们需要用到init_task,并且在头文件加入init_task.h库。

4、然后,我们用for_each_process遍历我们的每一个进程,并输出我们需要得到的进程信息。

5、最后是函数注册已经模块许可声明,这是必须加入的。

6、编译Makefile

obj-m:=pPid.o
KERNELBUILD :=/lib/modules/$(shell uname -r)/build
default: make -C $(KERNELBUILD) M=$(shell pwd) modules
clean:rm -rf *.o *.ko *.mod.c .*.cmd *.markers *.order *.symvers .tmp_versions

7、make后使用insmod加入模块

8、dmesg显示使用情况,如图所示

二、 以某个进程的 PID 号为参数,列出该进程的家族信息,包括父进程、兄弟进程和子进程的程序名、PID 号

1、代码如下:

#include<linux/init.h>
#include<linux/module.h>
#include<linux/kernel.h>
#include <linux/sched.h>
#include <linux/moduleparam.h>static pid_t pid=1;
module_param(pid,int,0644);static int hello_init(void)
{struct task_struct *p;struct list_head *pp;struct task_struct *psibling;// 当前进程的 PIDp = pid_task(find_vpid(pid), PIDTYPE_PID);printk("me: %d %s\n", p->pid, p->comm);// 父进程if(p->parent == NULL) {printk("No Parent\n");}else {printk("Parent: %d %s\n", p->parent->pid, p->parent->comm);}// 兄弟进程list_for_each(pp, &p->parent->children){psibling = list_entry(pp, struct task_struct, sibling);printk("sibling %d %s \n", psibling->pid, psibling->comm);}// 子进程list_for_each(pp, &p->children){psibling = list_entry(pp, struct task_struct, sibling);printk("children %d %s \n", psibling->pid, psibling->comm);}return 0;
}static void hello_exit(void)
{printk(KERN_ALERT"goodbye!\n");
}module_init(hello_init);
module_exit(hello_exit);MODULE_LICENSE("GPL");

2、查看当前进程的父进程

if(p->parent == NULL) {printk("No Parent\n");
}
else {printk("Parent: %d %s\n", p->parent->pid, p->parent->comm);
}

3、查找当前进程的兄弟进程

list_for_each(pp, &p->parent->children)
{psibling = list_entry(pp, struct task_struct, sibling);printk("sibling %d %s \n", psibling->pid, psibling->comm);
}

4、查找当前进程的子进程

list_for_each(pp, &p->children)
{psibling = list_entry(pp, struct task_struct, sibling);printk("children %d %s \n", psibling->pid, psibling->comm);
}

5、编译模块并插入模块后,使用dmesg查看消息如下:

Linux内核编程打印所有线程信息相关推荐

  1. Linux内核出错的栈打印详解,linux内核中打印栈回溯信息 - dump_stack()函数分析

    简介 当内核出现比较严重的错误时,例如发生Oops错误或者内核认为系统运行状态异常,内核就会打印出当前进程的栈回溯信息,其中包含当前执行代码的位置以及相邻的指令.产生错误的原因.关键寄存器的值以及函数 ...

  2. linux内核编程_内核线程kthread_run

    linux内核编程_内核线程kthread_run 1. 简述: 2. 使用示例: 3. 详述: 1. 简述: 头文件: include/linux/kthread.h 数据类型: struct ta ...

  3. 【华为云技术分享】Linux内核编程环境 (1)

    在上一期中,我们介绍了Linux内核的源码结构,这一期我们介绍Linux内核编程环境,首先介绍的是Linux内核的编译方法. 一.Linux内核编译方法 本期中我们以Linux 4.19.94版内核来 ...

  4. 初探linux内核编程,参数传递以及模块间函数调用

    一.前言 我们一起从3个小例子来体验一下linux内核编程.如下: 1. 内核编程之hello world 2. 模块参数传递 3. 模块间函数调用 二.准备工作 首先,在你的linux系统上面安装l ...

  5. linux内核编程(hello world示例程序)

    linux内核编程(hello world) Linux可加载内核模块是 Linux 内核的最重要创新之一.它们提供了可伸缩的.动态的内核.其它开发者可以不用重新编译整个内核便可以开发内核层的程序,极 ...

  6. Linux 内核编程指南

    Linux 内核编程指南   PeterJay Salzman MichaelBurian OriPomerantz Copyright© 2001 Peter Jay Salzman 2007−05 ...

  7. linux内核_Linux驱动编程的本质就是Linux内核编程

    由于Linux驱动编程的本质属于Linux内核编程,因此我们非常有必要熟悉Linux内核以及Linux内核的特点. 这篇文章将会帮助读者打下Linux驱动编程的基础知识. 本篇文章分为如下三个小节进行 ...

  8. Linux内核编程接口函数

    Linux内核编程接口函数 转载请注明出处: http://blog.csdn.net/drivelinux/article/details/8656280 字符设备相关函数 1.alloc_chrd ...

  9. linux内核编程(一)

    这些天在学习linux内核编程,就在这里小小的show以下. 首先编写如下的linux代码.并命名为hello.c 这里你应该注意亮点: 第一.linux内核编程,不同于普通的用户态下的编程:有一个入 ...

  10. Linux 内核编程风格

    Linux 内核编程风格 (518 个字於此篇帖子) (已阅读: 1177 次) 这篇短小的文章是对Linux内核编程风格的建议.编程风格非常的个性化,而且,我并不想将我的观点强加给任何人,但是为了变 ...

最新文章

  1. 操蛋的linux改mysql密码(1054和1819错误)
  2. html制作一个简单的邮件,使用HTML编写简单的邮件模版
  3. mysql 5.6.37 winx64_Mysql 5.6.37 winx64安装双版本mysql笔记记录
  4. 提供基于transformer的pipeline、准确率达SOTA
  5. Oracle创建表语句(Create table)语法详解及示例
  6. ES8新特性_await表达式---JavaScript_ECMAScript_ES6-ES11新特性工作笔记049
  7. sql tempdb清理_SQL Server 2019内存优化的TempDB元数据
  8. java 日期 年数_关于java:为什么不赞成使用“新日期(整数年,整数月,整数日)”?...
  9. mongodb数据库的启动和停止
  10. phpstorm取消自动保存,修改未保存的文件显示*星号
  11. 前端视频分片上传(blob)vue react uni 均适用
  12. 音视频开发系列(10):基于qt的音频推流
  13. html播放韰 寸 频,asp.net 汉字转换拼音及首字母实现代码
  14. Uncode、ASCII、UTF-8之前的转换函数
  15. Juniper SRX密码恢复
  16. 员工身高体重决定能否晋升?自如回应
  17. DevC++实现代码高亮复制进word
  18. 前端自动化测试基础-sinon篇章
  19. 大数据掀人类文明革命 探索更多未知
  20. securityCRT使用小结

热门文章

  1. 双人五子棋(C++游戏)游戏代码在最底下
  2. Java内存模型—JMM详解
  3. Java 详解(JVM) 垃圾回收机制原理
  4. 软件体系结构风格整理
  5. linux 6.4 multipath.conf跟其他版本的区别,宏杉与其他厂商存储共用multipath的配置方法...
  6. 宏杉科技摆“擂台”,遍寻天下存储技术高手
  7. keil c语言怎么写程序,用keil软件如何编写单片机程序?
  8. python模糊匹配_python 字符串模糊匹配 Fuzzywuzzy
  9. 组态软件与PLC远程控制的配置
  10. chrome官网下载离线安装包