如何在执行之前获取新进程的PID?

时间:2012-07-27 00:10:11

标签: macos pid function-interposition interposing library-interposition

因此我可以使用inject_and_interpose代码进行一些注入和插入,我需要获取新启动的进程的PID (典型的闭源用户应用程序)在实际执行之前。

要明确的是,我需要做的不仅仅是“快速注意” - 我无法轮询,或者接收一些异步通知,这意味着该进程已经执行了几毫秒采取行动。

我需要有机会在单个语句执行之前进行注入和插入。

我愿意编写一个后台进程,当一个特定名称的进程出现时,该进程会同步通知。我也愿意编写一个启动器应用程序,然后启动目标应用程序。

任何解决方案都需要支持至少低于10.5(Leopard)到10.8(Mountain Lion)的64位代码。

如果事实证明这很简单,我会继续承认我是OS X的新手:)谢谢!

1 个答案:

答案 0 :(得分:1)

我知道如何在Linux上执行此操作,因此在OSX上可能会是相同的(-ish)。

您首先致电fork()以复制您的流程。 fork()的返回值表示您是父母还是孩子。父级获取子进程的pid,子级为零。

然后,孩子调用exec()实际开始执行新的可执行文件。通过使用在调用fork之前创建的管道,子进程可以在执行新的可执行文件之前等待父进程执行任何操作。

pid_t pid = fork();
if (pid == -1) {
    perror("fork");
    exit(1);
}
if (pid > 0) {
    // I am the parent, and pid is the PID of the child process.

    //TODO: If desired, somehow notify child to proceed with exec
}
else {
    // I am the child.

    //TODO: If desired, wait no notification from parent to continue

    execl("path/to/executable", "executable", "arg1", NULL);

    // Should never get here.
    fprintf(stderr, "ERROR: execl failed!\n");  
}