2013-04-10 141 views

回答

2

如果你看看来源为regular implementation of the ptrace system call,你可以看到它与struct proc代表则传递中作为第一个参数调用过程的工作:

int 
ptrace(struct proc *p, struct ptrace_args *uap, int32_t *retval) 
{ 
    // … 
    if (uap->req == PT_DENY_ATTACH) { 
     proc_lock(p); 
     if (ISSET(p->p_lflag, P_LTRACED)) { 
      proc_unlock(p); 
      KERNEL_DEBUG_CONSTANT(BSDDBG_CODE(DBG_BSD_PROC, BSD_PROC_FRCEXIT) | DBG_FUNC_NONE, 
          p->p_pid, W_EXITCODE(ENOTSUP, 0), 4, 0, 0); 
      exit1(p, W_EXITCODE(ENOTSUP, 0), retval); 
      /* drop funnel before we return */ 
      thread_exception_return(); 
      /* NOTREACHED */ 
     } 
     SET(p->p_lflag, P_LNOATTACH); 
     proc_unlock(p); 

     return(0); 
    } 

可以在<sys/proc.h>使用的功能获取有关给定进程的信息,例如proc_pid来查找pid。

+0

在这种情况下,您可能只需调用['proc_selfpid()'](http://fxr.watson.org/fxr/ident?v=xnu-2050.18.24;im=bigexcerpts;i=proc_selfpid)。 – Hasturkun 2013-04-10 08:57:54

+0

在实践中你是对的。理论上讲,如果函数是直接调用的,而不是来自用户进程的系统调用,调用者可能会通过参数传递不同的进程。 – bdash 2013-04-10 09:19:15