吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何獲取Linux所有進程信息

麥辣雞腿堡 ? 來源:嵌入式Linux系統開發 ? 作者:Jasonangel ? 2023-10-07 15:18 ? 次閱讀

很多時候,我們要監控系統狀態,即監控系統cpu負載、進程狀態等情況,如果我們在 Linux 應用層,我們有很多方式,命令行中常用 top、ps 命令,代碼中,我們可以使用 popen 函數去執行一個 top 命令,獲取返回值。或者我們直接讀寫 /proc下面的文件,都可以達到目的。

但如果要你在內核(驅動)中去獲取這些信息,你無法執行 top 命令。即便可以使用 flip_open 函數和加 vfs_read 內核函數去讀寫 /proc 節點文件,但 Linux 本身不建議這樣做,這會破壞節點(驅動)之間的獨立性,如果產生依賴關系,很可能產生各種各樣的問題:如果你在一個節點驅動中讀寫另外一個節點的內容,而另外一個掛載出了問題,系統就會不穩定。

所以我們一般直接從 Linux 內核本身獲取信息,去分析 Linux 內核源碼,從他本身的數據結構(結構體、變量、鏈表)中獲取信息。

今天教大家如何在驅動中直接獲取 linux 系統中所有進程信息。進程有很多信息,在 /proc/[pid] 目錄中中只放了很少一部分,我們訪問內核數據結構可以獲取全部所有信息。

我們知道Linux系統管理進程是使用PCB(process control block),進程控制塊,內核使用一個結構體描述它,這個結構體現在有600多行,叫 task_struct 結構體,這個結構體在 linux 內核源碼 linux/include/linux/sched.h 中。

task.c

# include < linux/kernel.h >
# include < linux/module.h >
# include < uapi/linux/sched.h >
# include < linux/init_task.h >
# include < linux/init.h >
# include < linux/fdtable.h >
# include < linux/fs_struct.h >
# include < linux/mm_types.h >
//內核模塊初始化函數
static int __init traverse_pcb(void)
{
 struct task_struct *task, *p;//定義指向task_struct類型的指針
 struct list_head *pos;//定義雙向鏈表指針
 int count=0;//定義統計系統進程個數的變量
 printk("Printf process'message begin:n");//提示模塊開始運行
 task = &init_task;//指向0號進程的PCB
 
 list_for_each(pos,&task- >tasks)//使用list_for_each宏來遍歷進程鏈表
 {
  p = list_entry(pos,struct task_struct,tasks);//指向當前進程的task_struct結構
  count++;//統計系統進程個數
  printk("nn");//方便查看后續打印信息
  /*
  打印task_struct中的字段.comm:name.pid:進程的pid號;state:進程的狀態;
  prio:動態優先級;static_prio:靜態優先級; parent'pid:父進程的pid號;
  count:文件系統信息,文件被使用的次數; umask:進程權限位的默認設置;
  使用atomic_read原子操作是為了(p- >files)- >count字段計數不被打斷
  */
  printk("comm:%s; pid:%d; state:%lx; prio:%d; static_prio:%d; parent'pid:%d; count:%d; umask:%d;", 
   p- >comm,p- >pid,p- >state,p- >prio,p- >static_prio,(p- >parent)- >pid,        
   atomic_read((&(p- >files)- >count)),(p- >fs)- >umask);
  //打印進程地址空間的信息
  if((p- >mm)!=NULL)
   printk("total_vm:%ld;",(p- >mm)- >total_vm);//total_vm:線性區總的頁數
 }
 printk("進程的個數:%dn",count);//打印進程個數
 return 0;
}
 
//內核模塊退出函數
static void __exit end_pcb(void)
{
 printk("traverse pcb is end.");
}
module_init(traverse_pcb);//入口
module_exit(end_pcb);//出口
MODULE_LICENSE("GPL");//許可證

Makefile

KERNELDIR := /home/book/linux/tool/kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek

CURRENT_PATH := $(shell pwd)

obj-m := task.o

build: kernel_modules

kernel_modules:
 $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules

clean:
 $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean

編譯

圖片

我們會編譯出一個task.ko內核模塊,把它拷貝到板子中,進行掛載。

圖片

掛載上以后就會觸發 _init 函數,就會打印。當然我們也可以把這段代碼放在 xxx_read 函數中,在 _init 函數中創建節點,訪問一次節點就打印一次,都可以。

博主這個系統進程很少,只有 70-80 個,是 buildroot 自己編譯的文件系統,沒有什么功能。

我們通過定義的p結構體指針,可以訪問系統中所有進程的 io、運行時間、內存信息、進程被調用次數,任何和進程有關的信息都存在于 task_struct 中。

Linux 內核采用 task_struct 來描述一個進程。當系統起來以后,隨著 init(pid=1)進程 fork 出其他進程,會有一個雙向鏈表,將所有的由 init 創建的進程串起來,我們通過遍歷這個雙向鏈表,進而獲取所有進程的 task_struct 結構體,把信息取出來。在驅動中這樣做,遠比訪問 /proc 文件方便多了。

note:編譯之前記得準備好你的 Linux 內核源碼,因為編譯需要引用頭文件,所以我們在 Makefile 中寫明 Linux 內核源碼目錄(源碼必須是編譯過的源碼,編譯 Linux 大概需要半個多小時)。另外需要注意,你編譯驅動所引用的內核和你板子中真正運行的 Linux 內核要需要是同一個版本,否則掛載不上去。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內核
    +關注

    關注

    3

    文章

    1382

    瀏覽量

    40427
  • Linux
    +關注

    關注

    87

    文章

    11345

    瀏覽量

    210402
  • 監控系統
    +關注

    關注

    21

    文章

    3941

    瀏覽量

    176875
  • 系統
    +關注

    關注

    1

    文章

    1019

    瀏覽量

    21431
收藏 人收藏

    評論

    相關推薦

    Linux開發_Linux進程編程

    介紹Linux進程概念、進程信號捕獲、進程管理相關的命令的使用等知識點。
    的頭像 發表于 09-17 15:38 ?1407次閱讀
    <b class='flag-5'>Linux</b>開發_<b class='flag-5'>Linux</b>下<b class='flag-5'>進程</b>編程

    Linux如何獲取寫文件的進程

    centos7 在某一段時間監控報警磁盤使用率達99%,由于監控屬于概要形式信息,沒有快照信息的監控(能發現某進程的I/O,CPU消耗情況),所以需要在服務器上去定時執行統計命令獲取
    發表于 10-08 11:25 ?939次閱讀

    Linux下的進程結構

    `#嵌入式培訓#華清遠見嵌入式linux學習資料《Linux下的進程結構》,進程不但包括程序的指令和數據,而且包括程序計數器和處理器的所有
    發表于 08-05 11:05

    Linux 查看進程和刪除進程

    ps 命令用于查看當前正在運行的進程。grep 是搜索例如: ps -ef | grep java表示查看所有進程里 CMD 是 java 的進程
    發表于 04-24 00:04

    Linux下的進程結構

    進程不但包括程序的指令和數據,而且包括程序計數器和處理器的所有寄存器及存儲臨時數據的進程堆棧,因此正在執行的進程包括處理器當前的一切活動。 因為Li
    發表于 05-27 09:24

    【工程源碼】Linux 查看進程和刪除進程

    java表示查看所有進程里 CMD 是 java 的進程信息ps -aux | grep java-aux 顯示所有狀態pskill 命令
    發表于 02-23 20:05

    Linux現有的所有進程間IPC方式

    在開始回答前,先簡單概括性地說說Linux現有的所有進程間IPC方式:1. **管道:**在創建時分配一個page大小的內存,緩存區大小比較有限;2. 消息隊列:信息復制兩次,額外的C
    發表于 08-20 06:17

    Linux進程管理

    Linux進程管理 本章主要介紹進程的概念、狀態、構成以及Linux進程的相關知識。 掌握進程
    發表于 04-28 14:57 ?0次下載

    Linux守護進程詳解

    分享到:標簽:進程控制 Linux 守護進程進程 7.3 Linux守護進程 7.3.1 守
    發表于 10-18 14:24 ?0次下載
    <b class='flag-5'>Linux</b>守護<b class='flag-5'>進程</b>詳解

    Linux和UNIX可以用什么命令查看運行中進程的相關信息

      你可以使用ps命令。它能顯示當前運行中進程的相關信息,包括進程的PID。Linux和UNIX都支持ps命令,顯示所有運行中
    發表于 01-20 09:42 ?6492次閱讀

    Linux進程管理:什么是進程進程的生命周期

    所有運行在Linux操作系統中的進程都被task_struct結構管理,該結構同時被叫作進程描述。一個進程描述包含一個運行
    的頭像 發表于 02-15 14:29 ?8068次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>進程</b>管理:什么是<b class='flag-5'>進程</b>?<b class='flag-5'>進程</b>的生命周期

    Linux系統下init進程的前世今生

    kernel_thread產生的進程,其開始在內核態執行,然后通過一個系統調用,開始執行用戶空間的/sbin/init程序,期間Linux內核也經歷了從內核態到用戶態的特權級轉變,/sbin/init極有可能產生出了shell,然后所有
    發表于 04-28 17:23 ?997次閱讀

    Linux進程的概念說明

    進程Linux 操作系統中最重要的基本概念之一,這一節我們將了解學習 Linux 進程的一些基礎知識。
    發表于 07-14 14:27 ?789次閱讀

    用來獲取linux系統信息的shell腳本

    一、腳本 今天主要分享一個shell腳本,用來獲取linux系統CPU、內存、磁盤IO等信息。 #!/bin/bash# 獲取要監控的本地服務器IP地址 IP=`ifconfig |
    的頭像 發表于 08-25 16:00 ?5249次閱讀

    linux查看weblogic進程

    和性能情況。本文將詳細介紹在Linux系統中如何查看WebLogic進程。 一、使用ps命令查看WebLogic進程 打開終端,使用以下命令查看所有WebLogic
    的頭像 發表于 12-05 16:07 ?2018次閱讀
    大发扑克网站| 威尼斯人娱乐网反水| A8百家乐官网娱乐场| 六合彩开码现场| 百家乐娱乐网备用网址| 博彩百家乐官网画谜网| 百家乐官网赢家公式| 大发888移动版| 克拉克百家乐下载| 网站百家乐官网博彩| 3d棋牌游戏| 包赢百家乐的玩法技巧和规则 | k7娱乐| 百家乐操作技巧| 澳门百家乐海洋阿强| 凤凰百家乐官网的玩法技巧和规则| 读书| 新葡京娱乐城官方网址| 星期8百家乐娱乐城| 百家乐总厂在哪里| 七胜百家乐官网娱乐| 大世界百家乐官网现金网| 六合彩综合资料| 威尼斯人娱乐城梧州店| 澳门百家乐下三路| 高级百家乐官网桌布| 真人百家乐官网新开户送彩金| 台南市| 大发888游戏是真的么| 爱拼百家乐的玩法技巧和规则| 百家乐代打是真的吗| 最佳场百家乐官网的玩法技巧和规则 | 个人百家乐策略| 乐宝百家乐游戏| 百家乐官网常用公式| 真人百家乐官网娱乐好玩| 绵竹市| 云博娱乐城官网注册| 大发888官网亚洲线上| 优博百家乐的玩法技巧和规则| 永康百家乐赌博|