获得调用系统调用的进程的pid的方法?

时间:2013-04-10 08:16:38

标签: macos kernel kernel-extension

我做了一个kext来使用我的系统调用而不是引用的现有系统调用 Re-routing System Calls

在测试期间,我想知道哪个进程调用此系统调用。

除了指定的进程外,我需要允许应用程序正常继续。

有什么能获得调用过程的信息吗?

1 个答案:

答案 0 :(得分: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。