2016-05-05 1 views
2

実行中のプロセスをすべてpid、ppid、comm、およびsizeでリストしたいと思います。次のコードはppidとsizeを除いて動作します。cを使用してすべてのプロセス情報をリストアップ

--code -

#include <linux/slab.h> 
#include <linux/types.h> 
#include <linux/unistd.h> 
#include "sched.h" 
#include "sched1.h" 


/* This function is called when the module t is loaded. */ 
int process_init(void) 
{ 
    printk(KERN_INFO "lOADING MODULE \n"); 
    printk(KERN_INFO "PID \t PPID \t PNAME \t SIZE \n"); 

    struct task_struct *task; 
    for_each_process(task) 
    { 
    printk(KERN_INFO "%d \t %d\t %s \t %d \n", task->pid,task->ppid,task->comm,task->sz); 
    } 

     return 0; 
    } 
+0

だろう 'のexeclp( "PS"、 "PS"、 " - EF"、(char型*)NULL);'仕事あなたの目的の代わりにそのラインの –

+0

のため? –

+2

@ishyfishy彼が 'printk'を使用したことは、これがカーネル内部で実行されていることを意味し、ユーザプロセスでは実行されていません。彼はカーネルから 'execlp'を呼び出すことはできません。 – Barmar

答えて

1

親PIDと総VMサイズは直接task_structでエンコードされていない、あなたは親のpidを取得するためにtask_ppid_nrを呼び出し、プロセスのVMを取得するためにtask_struct->mmを使用する必要がありますサイズ。

次試してみてください。

#include <linux/slab.h> 
#include <linux/types.h> 
#include <linux/unistd.h> 
#include "sched.h" 
#include "sched1.h" 
int process_init(void) 
{ 
    printk(KERN_INFO "lOADING MODULE \n"); 
    printk(KERN_INFO "PID \t PPID \t PNAME \t SIZE \n"); 
    struct task_struct *task; 
    struct mm_struct *mm; 
    for_each_process(task) 
    { 
     mm = get_task_mm(task); 
     printk(KERN_INFO "%d \t %d\t %s \t %d \n", 
       task->pid, task_ppid_nr(task), task->comm, mm->total_vm); 
    } 

    return 0; 
} 
+0

1.タスクが解放されないようにするものはありません2. mmはnullでもかまいません3.ヌルでない場合は参照がリークします4. - 通信にはタスクがロックされている必要があります –

+0

@employeeofthemhem答えを編集してください。 – fluter

関連する問題