通过xdg-open创建的进程如何获取PID

8

情况如下:我分叉进程以用默认浏览器打开HTML文件。在我的情况下,它看起来是这样的:

if ((pid=fork())==0) {
    execlp("/usr/bin/xdg-open", "xdg-open", url, NULL);
    /*if execlp failed, exit the child*/
    exit(0);
}

然而,我想获取进程(打开的浏览器)的PID,以便稍后也可以关闭它。但是我似乎不知道如何获取它。如果您有任何建议,请告诉我。

2个回答

0

你应该已经有子进程的PID了,fork()函数的手册上说:

成功时,在父进程中返回子进程的PID,在子进程中返回0。

所以在子进程中检测到0后运行你的程序,在父进程中pid将是子进程的实际PID。

根据你的评论,接下来会发生的是xdg-open进程 - 你现在知道它的PID,将启动一个浏览器,而你无法直接访问该浏览器进程的PID。

目前我能想到的唯一做法是创建另一个子进程,然后在其中运行诸如ps或pgrep之类的命令。然后你可以解析该命令的输出,找到作为xdg-open子进程运行的浏览器的PID。这里有一个读取子进程输出的示例here


3
我不这么认为。子进程将运行xdg-open。但是,如果我理解正确的话,浏览器将在另一个进程中打开,因此PID将不同。 - elena
@elena:从man 3 exec中可以得知:exec()函数族用于将当前进程映像替换为新的进程映像。由于进行了替换,因此无需创建新进程,也不会分配新的进程ID。 - alk
3
是的,我已经阅读了man页面。但是,如果您看一下我的示例:execlp(“/ usr / bin / xdg-open”,“xdg-open”,url,NULL),您将看到xdg-open是替换的进程映像。反过来,xdg-open打开浏览器(因为url是一个html页面)。浏览器将在新进程中运行。因此,我需要该进程的PID。 - elena

-1

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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接