1. 程式人生 > >Linux驅動獲取程序PID和程序名字

Linux驅動獲取程序PID和程序名字

Linux驅動列印程序PID和程序名字

在核心中, 程序用task_struct結構表示, 其中有char comm[TASK_COMM_LEN]成員, 其含義是

executable name excluding path

按照標準做法, 應該使用get_task_comm()/set_task_comm()函式來獲取/設定此成員(為避免競爭, 這倆函式會呼叫task_lock()先拿鎖).
我們這裡簡便起見,就直接獲取comm值了,如下:

printk("%s (pid=%d, comm=%s)\n", __func__, current->pid, current->comm);

擴充套件閱讀:

// task_struct的基本資訊
struct task_struct {
//這個是程序的執行時狀態,-1代表不可執行,0代表可執行,>0代表已停止。
 volatile long state;
 /*
flags是程序當前的狀態標誌,具體的如:
0x00000002表示程序正在被建立;
0x00000004表示程序正準備退出;
0x00000040 表示此程序被fork出,但是並沒有執行exec;
0x00000400表示此程序由於其他程序傳送相關訊號而被殺死 。
*/
 unsigned int flags;
//表示此程序的執行優先順序
 unsigned int rt_priority;
//這裡出現了list_head結構體,詳情請參考
struct list_head tasks; //這裡出現了mm_struct 結構體,該結構體記錄了程序記憶體使用的相關情況,詳情請參考 struct mm_struct *mm; /* 接下來是程序的一些狀態引數*/ int exit_state; int exit_code, exit_signal; //這個是程序號 pid_t pid; //這個是程序組號 pid_t tgid; //real_parent是該程序的”親生父親“,不管其是否被“寄養”。 struct task_struct *real_parent; //parent是該程序現在的父程序,有可能是”繼父“ struct task_struct *parent; //這裡children指的是該程序孩子的連結串列,可以得到所有孩子的程序描述符,但是需使用list_for_each和list_entry,list_entry其實直接使用了container_of,詳情請參考
struct list_head children; //同理,sibling該程序兄弟的連結串列,也就是其父親的所有孩子的連結串列。用法與children相似。 struct list_head sibling; //這個是主執行緒的程序描述符,也許你會奇怪,為什麼執行緒用程序描述符表示,因為linux並沒有單獨實現執行緒的相關結構體,只是用一個程序來代替執行緒,然後對其做一些特殊的處理。 struct task_struct *group_leader; //這個是該程序所有執行緒的連結串列。 struct list_head thread_group; //顧名思義,這個是該程序使用cpu時間的資訊,utime是在使用者態下執行的時間,stime是在核心態下執行的時間。 cputime_t utime, stime; //下面的是啟動的時間,只是時間基準不一樣。 struct timespec start_time; struct timespec real_start_time; //comm是儲存該程序名字的字元陣列,長度最長為15,因為TASK_COMM_LEN為16。 char comm[TASK_COMM_LEN]; /* 檔案系統資訊計數*/ int link_count, total_link_count; /*該程序在特定CPU下的狀態*/ struct thread_struct thread; /* 檔案系統相關資訊結構體*/ struct fs_struct *fs; /* 開啟的檔案相關資訊結構體*/ struct files_struct *files; /* 訊號相關資訊的控制代碼*/ struct signal_struct *signal; struct sighand_struct *sighand; /*這些是鬆弛時間值,用來規定select()和poll()的超時時間,單位是納秒nanoseconds */ unsigned long timer_slack_ns; unsigned long default_timer_slack_ns; };