2016-04-10 64 views
0

Bir işlemin çocuk sayısını ve kardeşi hesaplama konusunda biraz kafam karışmış. Ben şu şekildedir bir süreç bilgi, bir yapı vardır:Çekirdek modunda bir işlemin çocuk sayısını ve kardeşi hesaplanıyor

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 */ 
}; 

Ve doldurur bir işlevi vardır ve yukarıdaki yapı dan işlem bilgileri döndürmek: Bütün doldurmak

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; 
} 

Hem çocuklar hem de kardeşlerin sayısı dışındaki bilgiler çok doğrudur, çünkü bunlar struct_list örneğinde zaten bulunmaktadır. Ancak, list_for_each işlevini kullanarak çocukların ve kardeşlerin sayısını hesaplamak istiyorum, ancak bunun doğru yol olup olmadığını bilmiyorum.

cevap

0

struct_destek yapıdaki çocuklar ve kardeşler, söz konusu görevin tüm çocuklarını ve kardeşlerini birbirine bağlar, bu yüzden evet, yaptığınız şey doğrudur.

+0

Ayrıca, bu görev kardeşleri ile sayılır veya hayır, çünkü her process_info için sayacım (bilgi almak için bu işlevi kullanan her bir işlemin süreç bilgisini ve bir dizideki farklı bir işlevde saklıyorum)) her zaman en az 1 mi sayılır? Bu doğru mu? – falhumai

+0

kardeş, aynı üst öğeyi paylaşan işlemlerdir, bu nedenle çoğu durumda 1'dir. Bu nedenle, birkaç işlemi iptal ederek doğrulayın ve ardından işlevlerden birini çocuklardan birinde arayın. – fluter

+0

Tamam, yardımın için teşekkürler – falhumai