2013-04-10 44 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

相關問題