在 C 程序中查找由 exec() 或 system() 启动的进程的 PID

Finding the PID of a process launched by exec() or system() in C program

我需要检索由 exec() 或 system() 启动的进程的 PID。我阅读了该主题并进行了研究,但我不理解使用 fork() 这样做的建议。

假设我有以下代码:

int pid = fork();

if (pid < 0 ) {
exit(1);
} else if (pid == 0 ) {
execlp("ls", "-a", NULL);
} else {
wait(0)
}

如何获取由 execlp 启动的进程的 pid(如果使用的是 system,则由 system() 启动)?我不需要终止进程,我只需要 PID 来检索有关它的统计信息。

exec* 函数族不创建新进程,而是用目标可执行文件的执行上下文替换调用它们的进程的执行上下文。发生这种情况时会保留 PID。

#include <unistd.h>
#include <stdio.h>

int main(void) {
    /* Normal execution */
    puts("Hello");

    /* Our programs contents get "replaced" by ls */
    execlp("ls", "-l", NULL);

    /* We never get here */
    puts("World!");
}

fork,另一方面,创建一个新的child进程,它当然有自己的PID。这个 child 进程继续执行它所产生的相同执行上下文的副本;一旦 fork 被调用,您就可以认为执行是“拆分”的。 forkreturns0在child进程中,child进程的PID在parent(我们原来的进程)

思路是fork,然后用exec*代替child进程的执行上下文

#include <unistd.h>
#include <stdio.h>

int main(void) {
    pid_t pid;
    /* Normal execution */
    puts("Hello");

    /* execution "splits" */
    pid = fork();
    if (pid == 0) {
        /* Our child's execution context get "replaced" by ls */
        execlp("ls", "-l", NULL);
    } else {
        /* still in the parent */
        printf("Child PID is: %d\n", (int) pid);
    }

    /* We only get here in the parent */
    puts("World!");
}

systemforkexec*waitpid 的包装器,它会阻塞调用进程,直到 child 进程完成执行。 child的PID没有上报,因为等到parent可以再次“行动”时,child的PID就没有意义了。


为清楚起见,省略了错误处理,但您应该处理 forkexec*wait* 函数的错误。