到目前为止,这是我的解决方案:
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;
}
它有效,但我不确定几件事:
p_tmp->pid == 0
它是否永远迭代,这是否意味着第一个进程的父指针不是NULL?p_tmp
或ansc
是否为空?宏与功能?
由于
答案 0 :(得分:0)
至于 4。:您希望通过使用宏而不是函数来获得什么?使用函数并且不使用宏几乎总是更好。
宏的基本问题包括(但不一定限于)以下内容:
return NOTDESCENDANT
行中的值。 (如果宏在具有匹配返回类型的函数内部使用,则可能有效。)此处还讨论了所有这些要点:Macro vs Function in C您还可以看到所有这些问题的一些示例。
底线:如有疑问,请始终使用函数或内联函数代替宏。
答案 1 :(得分:0)
这是否意味着第一个进程的父指针不是NULL?
根据sources, init任务的父级本身就是这个任务。
是否有必要检查
p_tmp
或ansc
是否为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;
}