Как я могу получить 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");
}