Как я могу получить PID нового процесса перед его выполнением?

Чтобы я мог делать некоторые вставки и вставки с использованием кода https://github.com/comex/inject_and_interpose, мне нужно получить PID недавно запущенного процесса (типичное пользовательское приложение с закрытым исходным кодом) до его фактического выполнения.

Чтобы быть ясным, мне нужно сделать лучше, чем просто "заметить это быстро"- я не могу опрашивать или получать какое-то асинхронное уведомление, что означает, что процесс уже выполняется в течение нескольких миллисекунд к тому времени, когда я предпринимаю действие.

Мне нужно иметь возможность сделать свои инъекции и вставки до того, как выполнится один оператор.

Я открыт для написания фонового процесса, который получает синхронное уведомление при появлении процесса с определенным именем. Я также открыт для написания приложения запуска, которое, в свою очередь, запускает целевое приложение.

Любое решение должно поддерживать как минимум 64-битный код от 10,5 (Leopard) до 10,8 (Mountain Lion).

В случае, если это окажется до боли простым, я пойду вперед и признаю, что я новичок в OS X:) Спасибо!

1 ответ

Я знаю, как сделать это в Linux, поэтому, возможно, это будет то же самое (-ish) в OSX.

Ты первый звонок 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");  
}
Другие вопросы по тегам