Linux源码阅读笔记07-进程管理4大常用API函数

简介: Linux源码阅读笔记07-进程管理4大常用API函数

ind_get_pid

find_get_pid(...)函数功能:根据进程编号获取对应的进程描述符,具体Linux内核源码对应函数设计如下:

获取进程描述符,且描述符的count+1,表示进程多一个用户

pid_task

pid_task(...)函数功能:获取任务的任务描述符数据信息,具体Linux内核源码对应函数设计如下:

pid_nr

pid_nr(...)函数功能:获取进程的全局进程号,具体Linux内核源码对应的函数设计如下:

__task_pid_nr_ns

__task_pid_nr_ns(...)函数功能:获取进程编号,具体Linux内核源码对应函数设计如下:

实验代码

#include <linux/sched.h>
#include <linux/pid.h>
#include <linux/module.h>
static int __init pidtest_initfunc(void)
{
    printk("调用 pidtest_initfunc(...)函数.\n");
    // 1 : find_get_pid(...)
    struct pid *kernelpid=find_get_pid(current->pid);
    printk("打印进程描述符 count 的值: %d\n",kernelpid->count);
    printk("打印进程描述符 level 的值: %d\n",kernelpid->level);
    printk("打印进程描述符 nnumbers 的值:%d\n",kernelpid->numbers[kernelpid->level].nr);
    // 2 : pid_nr(..)
    int iNr=pid_nr(kernelpid);
    printk("打印进程描述符的全局进程编号为:%d\n",iNr);
    printk("打印进程描述符的当前线程组编号为:%d\n",current->tgid);
    // 3 : pid_task(...)
    struct task_struct *ttask=pid_task(kernelpid,PIDTYPE_PID);
    printk("打印任务当前的状态为: %ld\n",ttask->stats);
    printk("打印任务当前的进程号为:%d\n",ttask->pid);
    // 4 : __task_pid_nr_ns(...)
    pid_t rest=__task_pid_nr_ns(ttask,PIDTYPE_PID,kernelpid->numbers[kernelpid->level].ns);
    printk("调用__task_pid_nr_ns(...)函数,输出结果为:%d\n",rest);
    printk("退出 pidtest_initfunc(...)函数.\n");
    return 0;
}
static void __exit pidtest_exitfunc(void)
{
    printk("正常退出 Linux 内核......\n");
}
MODULE_LICENSE("GPL");
module_init(pidtest_initfunc);
module_exit(pidtest_exitfunc);
obj-m:=pidtest.o  
CURRENT_PAHT:=$(shell pwd) 
LINUX_KERNEL:=$(shell uname -r)   
LINUX_KERNEL_PATH:=/usr/src/linux-headers-$(LINUX_KERNEL)
all:
  make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PAHT) modules
clean:
  make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PAHT) cleals
make
sudo insmod pidtest.ko
dmesg -c
相关文章
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
605 2
|
Ubuntu Linux Python
Tkinter错误笔记(一):tkinter.Button在linux下出现乱码
在Linux系统中,使用Tkinter库时可能会遇到中文显示乱码的问题,这通常是由于字体支持问题导致的,可以通过更换支持中文的字体来解决。
1306 0
Tkinter错误笔记(一):tkinter.Button在linux下出现乱码
|
存储 人工智能 API
AgentScope:阿里开源多智能体低代码开发平台,支持一键导出源码、多种模型API和本地模型部署
AgentScope是阿里巴巴集团开源的多智能体开发平台,旨在帮助开发者轻松构建和部署多智能体应用。该平台提供分布式支持,内置多种模型API和本地模型部署选项,支持多模态数据处理。
16475 78
AgentScope:阿里开源多智能体低代码开发平台,支持一键导出源码、多种模型API和本地模型部署
|
运维 监控 中间件
Linux运维笔记 - 如何使用WGCLOUD监控交换机的流量
WGCLOUD是一款开源免费的通用主机监控工具,安装使用都非常简单,它可以监控主机、服务器的cpu、内存、磁盘、流量等数据,也可以监控数据库、中间件、网络设备
|
存储 API 文件存储
单页图床HTML源码+本地API接口图床系统源码
图床系统是一种用于存储和管理图片文件的在线服务。它允许用户上传图片文件,并生成相应的图片链接,从而方便用户在网页、社交媒体或其他平台上分享图片。
737 2
单页图床HTML源码+本地API接口图床系统源码
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
1046 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
SQL 缓存 中间件
Linux必知词汇:应用程序接口(Application Program Interface,API)
Linux必知词汇:应用程序接口(Application Program Interface,API)
1107 0
|
12月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
1081 1
二、Linux文本处理与文件操作核心命令
|
12月前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
781 137
|
12月前
|
安全 Ubuntu Unix
一、初识 Linux 与基本命令
玩转Linux命令行,就像探索一座新城市。首先要熟悉它的“地图”,也就是/根目录下/etc(放配置)、/home(住家)这些核心区域。然后掌握几个“生存口令”:用ls看周围,cd去别处,mkdir建新房,cp/mv搬东西,再用cat或tail看文件内容。最后,别忘了随时按Tab键,它能帮你自动补全命令和路径,是提高效率的第一神器。
1716 58