查找任务'target'是否是task'acestor`的后代(linux kernel tasks)

时间:2016-10-18 20:37:45

标签: linux process kernel task

到目前为止,这是我的解决方案:

int is_descendant(task_t* ansc, task_t* targ)
{
    task_t* p_tmp;
    for(p_tmp = targ ; (p_tmp) && (ansc) && (p_tmp->pid) && (p_tmp->pid != ansc->pid) ; p_tmp = p_tmp->p_pptr) ; 
    if((!p_tmp) || (!current) || (!p_tmp->pid)) return -ESRCH;
    return 0;
}

它有效,但我不确定几件事:

  1. 没有检查p_tmp->pid == 0它是否永远迭代,这是否意味着第一个进程的父指针不是NULL?
  2. 是否有必要检查p_tmpansc是否为空?
  3. 有更好的方法吗? (使用O(1)space compl。)
  4. 宏与功能?

    由于

2 个答案:

答案 0 :(得分:0)

至于 4。:您希望通过使用宏而不是函数来获得什么?使用函数并且不使用宏几乎总是更好。

宏的基本问题包括(但不一定限于)以下内容:

  • 宏容易出错,因为它们使用文本替换。他们可能并不总是按照您的期望去做,找到这些错误并不总是微不足道。
  • 宏可能会导致不必要的副作用,例如多次评估表达式。
  • 宏无法返回return NOTDESCENDANT行中的值。 (如果宏在具有匹配返回类型的函数内部使用,则可能有效。)
  • 编写(也可能还读取)跨越多行的宏是一种痛苦。

此处还讨论了所有这些要点:Macro vs Function in C您还可以看到所有这些问题的一些示例。

底线:如有疑问,请始终使用函数或内联函数代替宏。

答案 1 :(得分:0)

  

这是否意味着第一个进程的父指针不是NULL?

根据sources init任务的父级本身就是这个任务。

  

是否有必要检查p_tmpansc是否为NULL?

父任务(->p_pptr)不能为NULL,因此p_tmp也不能为NULL。

ansc是函数体中未修改的函数的参数。函数是否应该接受NULL取决于设计。

  

有更好的方法吗? (使用O(1)空间compl。)

由于任务既不指向其所有祖先也不指向其所有后代,因此无法在常量时间执行操作(O(1))。

int is_descendant(task_t* ansc, task_t* targ)
{
    task_t* p_tmp;
    if(ansc->pid == 0) return 0; // init task is ansestor for all tasks.
    for(p_tmp = targ; p_tmp->pid; p_tmp = p_tmp->p_pptr)
        if(p_tmp == ansc) return 0; // Found path to 'ansc'
    // Reach init task without touching 'ansc'.
    return 1;
}