在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資訊的時間並也節省系統資源

最後修改日期: 3 6 月, 2022

作者

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。