在Linux可能會使用procps提供的pidof, ps, top…之類的工具提取process ID, procps利用Linux提供的/proc系統搜集所有運行的process資料, 這種資料目錄的樹狀搜索其時蠻耗時間的, 但如果把搜尋PID這件事放在kernel中做, 其實還蠻有效率的, 在kernel中根據process name搜尋PID, 只要用下面這段函式, 走訪kernel中的process列表並提取符合的結果並回傳PID
struct task_struct *task;
for_each_process(task) {
if (strcmp(process_name, task->comm)==0){
return task->pid;
}
}
所以可以寫一隻char driver提供read/write ioctl讓使用者利用該kernel API提取PID, 相關的範例程式碼在這邊有修改好的可供參考
利用kernel module可讓原本提取PID的動作加速至少100倍, 以下是用測試程式跑一次的結果
pidof(procps version) total execution time:0.005472 seconds
pidof(kernel version) total execution time:0.000044 seconds
對於需長期監控process的embedded system, 可藉此縮短monitor程式搜集system wide processes資訊的時間並也節省系統資源
留言