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

ffscu2ro  于 2023-01-08  发布在  其他
关注(0)|答案(1)|浏览(84)

我需要检索由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来检索有关它的统计信息。

cvxl0en2

cvxl0en21#

exec*家族的函数不会创建新进程,而是将调用它们的进程的执行上下文替换为目标可执行文件的执行上下文。

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

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

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

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

另一方面,fork * 创建 * 新的子进程,该子进程当然具有其自己的PID,该子进程继续执行从其产生的相同执行上下文的副本;一旦fork被调用,您可以认为执行被“分割”。fork在子进程中返回0,在父进程(我们的原始进程)中返回子进程的PID。
其思想是先使用fork,然后使用exec*替换子进程的执行上下文。

#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", "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的 Package 器,它阻塞调用进程,直到子进程完成其执行。不报告子进程的PID,因为到父进程可以再次“操作”时,子进程的PID已无意义。

  • 为清楚起见,示例中省略了错误处理,但应处理forkexec*wait*函数的错误。*

相关问题