我正在使用list_for_each
宏和sibling
current
的{{1}}字段来打印出task_struct
兄弟姐妹的数量。
这是代码(current
跟踪兄弟姐妹的数量):
inf.num_siblings
struct list_head *curr_node;
....
list_for_each(curr_node, &(current->sibling)) {
inf.num_siblings++;
}
...
//print inf.num_siblings
指向循环链接列表中的节点,因此我认为上面的代码应该正确计算所述列表中兄弟节点/节点的数量。
此代码似乎主要起作用。如果我在后台运行一个程序,它只是在运行“count siblings”代码之前永远循环,那么current->sibling
进程的兄弟节点数与运行循环代码之前存在的计数相比增加了一个。但是,如果我在开始循环之前运行一次调用current
的进程,而不是像我预期的那样看到兄弟计数增加2,它只会增加1。那是为什么?
以下是分叉然后循环的代码:
fork()
答案 0 :(得分:2)
当您致电fork
时,您创建的child
流程不是sibling
。当您分叉时,您将current->children
计数增加而不是current->sibling
计数:)
答案 1 :(得分:0)
来自:http://man7.org/linux/man-pages/man2/fork.2.html
当你调用fork()时,你创建的新进程是一个子进程,而不是你调用fork()的进程的兄弟。在这种情况下,兄弟姐妹正确地没有增加。
现在,如果您多次调用fork()并跟踪第一个子进程的兄弟计数,您将看到兄弟计数上升。