情况如下:我分叉进程以用默认浏览器打开HTML文件。在我的情况下,它看起来是这样的:
if ((pid=fork())==0) {
execlp("/usr/bin/xdg-open", "xdg-open", url, NULL);
/*if execlp failed, exit the child*/
exit(0);
}
然而,我想获取进程(打开的浏览器)的PID,以便稍后也可以关闭它。但是我似乎不知道如何获取它。如果您有任何建议,请告诉我。
你应该已经有子进程的PID了,fork()函数的手册上说:
成功时,在父进程中返回子进程的PID,在子进程中返回0。
所以在子进程中检测到0后运行你的程序,在父进程中pid将是子进程的实际PID。
根据你的评论,接下来会发生的是xdg-open进程 - 你现在知道它的PID,将启动一个浏览器,而你无法直接访问该浏览器进程的PID。
目前我能想到的唯一做法是创建另一个子进程,然后在其中运行诸如ps或pgrep之类的命令。然后你可以解析该命令的输出,找到作为xdg-open子进程运行的浏览器的PID。这里有一个读取子进程输出的示例here。
fork()
函数返回子进程的 pid 给父进程。
在子进程中,你可以使用标准的 getpid()
函数获取自己的 pid。
pid_t child_pid = fork();
if (child_pid < 0) {
perror("fork");
// error handling
} else if (!child_pid) {
// child goes here
pid_t my_pid = getpid();
} else {
// parent continues here
}
man 3 exec
中可以得知:exec()函数族用于将当前进程映像替换为新的进程映像。
由于进行了替换,因此无需创建新进程,也不会分配新的进程ID。 - alk