2016-04-10 10 views
0

プロセスの子プロセスと兄弟プロセスの数を計算するのはちょっと混乱します。私は、次のようなプロセス情報の構造体、持っている:カーネルモードでプロセスの子プロセスと兄弟プロセスの数を計算する

struct process_info { 
    long pid; /* Process ID */ 
    char name[/* Some size. */]; /* Program name of process */ 
    long state; /* Current process state */ 
    long uid; /* User ID of process owner */ 
    long nvcsw; /* # voluntary context switches */ 
    long nivcsw; /* # involuntary context switches */ 
    long num_children; /* # children process has */ 
    long num_siblings; /* # sibling process has */ 
}; 

を私はいっぱいになる機能を持っており、上記の構造体からプロセス情報を返す:

すべてを記入
struct process_info get_process_info(struct task_struct* this_task) { 
    struct process_info res; 
    int temp_num_children = 0; 
    int temp_num_sibling = 0; 
    struct list_head* traverse_ptr; 

    res.pid = this_task->pid; 
    memcpy(res.name, this_task->comm, /* The size of the string declared before the struct above. */); 
    res.state = this_task->state; 
    res.uid = this_task->cred->uid.val; 
    res.nvcsw = this_task->nvcsw; 
    res.nivcsw = this_task->nivcsw; 


    list_for_each(traverse_ptr, &(this_task->children)) { 
     ++temp_num_children; 
    } 


    list_for_each(traverse_ptr, &(this_task->sibling)) { 
     ++temp_num_sibling; 
    } 
    res.num_children = temp_num_children; 
    res.num_siblings = temp_num_sibling; 

    return res; 
} 

子と兄弟の両方の数を除いた情報は、すでに構造体task_listインスタンスにあるので、非常に単純です。しかし、私はlist_for_each関数を使って子供と兄弟の数を計算したいが、これが正しい方法であるかどうかはわかりません。

答えて

0

struct task_structの子と兄弟は、そのタスクのすべての子どもと兄弟をリンクします。そう、あなたがしていることは正しいです。

+0

また、私の各process_infoのカウンタ(私は各プロセスとその祖先のプロセス情報を別の関数の配列に格納していますので、この関数を使って情報を取得しています) )は常に少なくとも1を数えていますか?これは正しいです? – falhumai

+0

兄弟は同じ親を共有するプロセスなので、ほとんどの場合は1です。したがって、いくつかのプロセスをフォークすることで検証し、子のいずれかで関数を呼び出します。 – fluter

+0

助けてくれてありがとう – falhumai

関連する問題