在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何獲取Linux所有進(jìn)程信息

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

很多時(shí)候,我們要監(jiān)控系統(tǒng)狀態(tài),即監(jiān)控系統(tǒng)cpu負(fù)載、進(jìn)程狀態(tài)等情況,如果我們在 Linux 應(yīng)用層,我們有很多方式,命令行中常用 top、ps 命令,代碼中,我們可以使用 popen 函數(shù)去執(zhí)行一個(gè) top 命令,獲取返回值。或者我們直接讀寫 /proc下面的文件,都可以達(dá)到目的。

但如果要你在內(nèi)核(驅(qū)動(dòng))中去獲取這些信息,你無法執(zhí)行 top 命令。即便可以使用 flip_open 函數(shù)和加 vfs_read 內(nèi)核函數(shù)去讀寫 /proc 節(jié)點(diǎn)文件,但 Linux 本身不建議這樣做,這會(huì)破壞節(jié)點(diǎn)(驅(qū)動(dòng))之間的獨(dú)立性,如果產(chǎn)生依賴關(guān)系,很可能產(chǎn)生各種各樣的問題:如果你在一個(gè)節(jié)點(diǎn)驅(qū)動(dòng)中讀寫另外一個(gè)節(jié)點(diǎn)的內(nèi)容,而另外一個(gè)掛載出了問題,系統(tǒng)就會(huì)不穩(wěn)定。

所以我們一般直接從 Linux 內(nèi)核本身獲取信息,去分析 Linux 內(nèi)核源碼,從他本身的數(shù)據(jù)結(jié)構(gòu)(結(jié)構(gòu)體、變量、鏈表)中獲取信息。

今天教大家如何在驅(qū)動(dòng)中直接獲取 linux 系統(tǒng)中所有進(jìn)程信息。進(jìn)程有很多信息,在 /proc/[pid] 目錄中中只放了很少一部分,我們訪問內(nèi)核數(shù)據(jù)結(jié)構(gòu)可以獲取全部所有信息。

我們知道Linux系統(tǒng)管理進(jìn)程是使用PCB(process control block),進(jìn)程控制塊,內(nèi)核使用一個(gè)結(jié)構(gòu)體描述它,這個(gè)結(jié)構(gòu)體現(xiàn)在有600多行,叫 task_struct 結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體在 linux 內(nèi)核源碼 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 >
//內(nèi)核模塊初始化函數(shù)
static int __init traverse_pcb(void)
{
 struct task_struct *task, *p;//定義指向task_struct類型的指針
 struct list_head *pos;//定義雙向鏈表指針
 int count=0;//定義統(tǒng)計(jì)系統(tǒng)進(jìn)程個(gè)數(shù)的變量
 printk("Printf process'message begin:n");//提示模塊開始運(yùn)行
 task = &init_task;//指向0號(hào)進(jìn)程的PCB
 
 list_for_each(pos,&task- >tasks)//使用list_for_each宏來遍歷進(jìn)程鏈表
 {
  p = list_entry(pos,struct task_struct,tasks);//指向當(dāng)前進(jìn)程的task_struct結(jié)構(gòu)
  count++;//統(tǒng)計(jì)系統(tǒng)進(jìn)程個(gè)數(shù)
  printk("nn");//方便查看后續(xù)打印信息
  /*
  打印task_struct中的字段.comm:name.pid:進(jìn)程的pid號(hào);state:進(jìn)程的狀態(tài);
  prio:動(dòng)態(tài)優(yōu)先級(jí);static_prio:靜態(tài)優(yōu)先級(jí); parent'pid:父進(jìn)程的pid號(hào);
  count:文件系統(tǒng)信息,文件被使用的次數(shù); umask:進(jìn)程權(quán)限位的默認(rèn)設(shè)置;
  使用atomic_read原子操作是為了(p- >files)- >count字段計(jì)數(shù)不被打斷
  */
  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);
  //打印進(jìn)程地址空間的信息
  if((p- >mm)!=NULL)
   printk("total_vm:%ld;",(p- >mm)- >total_vm);//total_vm:線性區(qū)總的頁數(shù)
 }
 printk("進(jìn)程的個(gè)數(shù):%dn",count);//打印進(jìn)程個(gè)數(shù)
 return 0;
}
 
//內(nèi)核模塊退出函數(shù)
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

編譯

圖片

我們會(huì)編譯出一個(gè)task.ko內(nèi)核模塊,把它拷貝到板子中,進(jìn)行掛載。

圖片

掛載上以后就會(huì)觸發(fā) _init 函數(shù),就會(huì)打印。當(dāng)然我們也可以把這段代碼放在 xxx_read 函數(shù)中,在 _init 函數(shù)中創(chuàng)建節(jié)點(diǎn),訪問一次節(jié)點(diǎn)就打印一次,都可以。

博主這個(gè)系統(tǒng)進(jìn)程很少,只有 70-80 個(gè),是 buildroot 自己編譯的文件系統(tǒng),沒有什么功能。

我們通過定義的p結(jié)構(gòu)體指針,可以訪問系統(tǒng)中所有進(jìn)程的 io、運(yùn)行時(shí)間、內(nèi)存信息、進(jìn)程被調(diào)用次數(shù),任何和進(jìn)程有關(guān)的信息都存在于 task_struct 中。

Linux 內(nèi)核采用 task_struct 來描述一個(gè)進(jìn)程。當(dāng)系統(tǒng)起來以后,隨著 init(pid=1)進(jìn)程 fork 出其他進(jìn)程,會(huì)有一個(gè)雙向鏈表,將所有的由 init 創(chuàng)建的進(jìn)程串起來,我們通過遍歷這個(gè)雙向鏈表,進(jìn)而獲取所有進(jìn)程的 task_struct 結(jié)構(gòu)體,把信息取出來。在驅(qū)動(dòng)中這樣做,遠(yuǎn)比訪問 /proc 文件方便多了。

note:編譯之前記得準(zhǔn)備好你的 Linux 內(nèi)核源碼,因?yàn)榫幾g需要引用頭文件,所以我們在 Makefile 中寫明 Linux 內(nèi)核源碼目錄(源碼必須是編譯過的源碼,編譯 Linux 大概需要半個(gè)多小時(shí))。另外需要注意,你編譯驅(qū)動(dòng)所引用的內(nèi)核和你板子中真正運(yùn)行的 Linux 內(nèi)核要需要是同一個(gè)版本,否則掛載不上去。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1382

    瀏覽量

    40427
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11345

    瀏覽量

    210403
  • 監(jiān)控系統(tǒng)

    關(guān)注

    21

    文章

    3941

    瀏覽量

    176885
  • 系統(tǒng)
    +關(guān)注

    關(guān)注

    1

    文章

    1019

    瀏覽量

    21431
收藏 人收藏

    評論

    相關(guān)推薦

    Linux開發(fā)_Linux進(jìn)程編程

    介紹Linux進(jìn)程概念、進(jìn)程信號(hào)捕獲、進(jìn)程管理相關(guān)的命令的使用等知識(shí)點(diǎn)。
    的頭像 發(fā)表于 09-17 15:38 ?1407次閱讀
    <b class='flag-5'>Linux</b>開發(fā)_<b class='flag-5'>Linux</b>下<b class='flag-5'>進(jìn)程</b>編程

    Linux如何獲取寫文件的進(jìn)程號(hào)

    centos7 在某一段時(shí)間監(jiān)控報(bào)警磁盤使用率達(dá)99%,由于監(jiān)控屬于概要形式信息,沒有快照信息的監(jiān)控(能發(fā)現(xiàn)某進(jìn)程的I/O,CPU消耗情況),所以需要在服務(wù)器上去定時(shí)執(zhí)行統(tǒng)計(jì)命令獲取
    發(fā)表于 10-08 11:25 ?939次閱讀

    Linux下的進(jìn)程結(jié)構(gòu)

    `#嵌入式培訓(xùn)#華清遠(yuǎn)見嵌入式linux學(xué)習(xí)資料《Linux下的進(jìn)程結(jié)構(gòu)》,進(jìn)程不但包括程序的指令和數(shù)據(jù),而且包括程序計(jì)數(shù)器和處理器的所有
    發(fā)表于 08-05 11:05

    Linux 查看進(jìn)程和刪除進(jìn)程

    ps 命令用于查看當(dāng)前正在運(yùn)行的進(jìn)程。grep 是搜索例如: ps -ef | grep java表示查看所有進(jìn)程里 CMD 是 java 的進(jìn)程
    發(fā)表于 04-24 00:04

    Linux下的進(jìn)程結(jié)構(gòu)

    進(jìn)程不但包括程序的指令和數(shù)據(jù),而且包括程序計(jì)數(shù)器和處理器的所有寄存器及存儲(chǔ)臨時(shí)數(shù)據(jù)的進(jìn)程堆棧,因此正在執(zhí)行的進(jìn)程包括處理器當(dāng)前的一切活動(dòng)。 因?yàn)?b class='flag-5'>Li
    發(fā)表于 05-27 09:24

    【工程源碼】Linux 查看進(jìn)程和刪除進(jìn)程

    java表示查看所有進(jìn)程里 CMD 是 java 的進(jìn)程信息ps -aux | grep java-aux 顯示所有狀態(tài)pskill 命令
    發(fā)表于 02-23 20:05

    Linux現(xiàn)有的所有進(jìn)程間IPC方式

    在開始回答前,先簡單概括性地說說Linux現(xiàn)有的所有進(jìn)程間IPC方式:1. **管道:**在創(chuàng)建時(shí)分配一個(gè)page大小的內(nèi)存,緩存區(qū)大小比較有限;2. 消息隊(duì)列:信息復(fù)制兩次,額外的C
    發(fā)表于 08-20 06:17

    Linux進(jìn)程管理

    Linux進(jìn)程管理 本章主要介紹進(jìn)程的概念、狀態(tài)、構(gòu)成以及Linux進(jìn)程的相關(guān)知識(shí)。 掌握進(jìn)程
    發(fā)表于 04-28 14:57 ?0次下載

    Linux守護(hù)進(jìn)程詳解

    分享到:標(biāo)簽:進(jìn)程控制 Linux 守護(hù)進(jìn)程進(jìn)程 7.3 Linux守護(hù)進(jìn)程 7.3.1 守
    發(fā)表于 10-18 14:24 ?0次下載
    <b class='flag-5'>Linux</b>守護(hù)<b class='flag-5'>進(jìn)程</b>詳解

    Linux和UNIX可以用什么命令查看運(yùn)行中進(jìn)程的相關(guān)信息

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

    Linux進(jìn)程管理:什么是進(jìn)程進(jìn)程的生命周期

    所有運(yùn)行在Linux操作系統(tǒng)中的進(jìn)程都被task_struct結(jié)構(gòu)管理,該結(jié)構(gòu)同時(shí)被叫作進(jìn)程描述。一個(gè)進(jìn)程描述包含一個(gè)運(yùn)行
    的頭像 發(fā)表于 02-15 14:29 ?8069次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>進(jìn)程</b>管理:什么是<b class='flag-5'>進(jìn)程</b>?<b class='flag-5'>進(jìn)程</b>的生命周期

    Linux系統(tǒng)下init進(jìn)程的前世今生

    kernel_thread產(chǎn)生的進(jìn)程,其開始在內(nèi)核態(tài)執(zhí)行,然后通過一個(gè)系統(tǒng)調(diào)用,開始執(zhí)行用戶空間的/sbin/init程序,期間Linux內(nèi)核也經(jīng)歷了從內(nèi)核態(tài)到用戶態(tài)的特權(quán)級(jí)轉(zhuǎn)變,/sbin/init極有可能產(chǎn)生出了shell,然后所有
    發(fā)表于 04-28 17:23 ?997次閱讀

    Linux進(jìn)程的概念說明

    進(jìn)程Linux 操作系統(tǒng)中最重要的基本概念之一,這一節(jié)我們將了解學(xué)習(xí) Linux 進(jìn)程的一些基礎(chǔ)知識(shí)。
    發(fā)表于 07-14 14:27 ?789次閱讀

    用來獲取linux系統(tǒng)信息的shell腳本

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

    linux查看weblogic進(jìn)程

    和性能情況。本文將詳細(xì)介紹在Linux系統(tǒng)中如何查看WebLogic進(jìn)程。 一、使用ps命令查看WebLogic進(jìn)程 打開終端,使用以下命令查看所有WebLogic
    的頭像 發(fā)表于 12-05 16:07 ?2018次閱讀
    主站蜘蛛池模板: 久久亚洲精品成人综合 | 就去色播| 欧美7777kkkk免费看258 | 午夜精品福利在线观看 | 亚洲精品第一 | 精品理论片 | 综合网 色天使 | 老色皮永久免费网站 | 欧美日操| 黄色福利站| 午夜网站视频 | 国产又大又黄又粗又爽 | 性欧美高清短视频免费 | 国内免费视频成人精品 | 中文一区二区在线观看 | www.色com| 天天操天天摸天天干 | 又粗又长又大又黄的日本视频 | www国产永久免费视频看看 | 亚洲第一区视频 | 欧美三级黄 | 女人被免费网站视频在线 | 四虎在线永久 | 五月综合色啪 | 777国产精品永久免费观看 | 天堂在线最新资源 | 亚洲好骚综合 | 九九国产在线观看 | 在线种子资源网 | 亚洲日本高清 | 国产欧美日韩综合精品一区二区 | 午夜精品视频在线观看 | 大黄网站色多多 | 亚洲欧美日韩一区 | 男女免费观看视频 | 色播五月激情 | 一本大道加勒比久久 | 激情欧美一区二区三区中文字幕 | 伊人手机在线观看 | 天天干天天操天天爱 | 天天操夜夜操夜夜操 |