【问题标题】:Getting PID of the process created by xdg-open获取 xdg-open 创建的进程的 PID
【发布时间】:2014-03-09 11:32:18
【问题描述】:

情况如下:我fork进程用默认浏览器打开一个html文件。这是我的情况:

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

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

【问题讨论】:

    标签: c exec fork


    【解决方案1】:

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

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

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

    根据您的评论,接下来会发生的是 xdg-open 进程 - 您现在的 PID 将依次启动浏览器,而您无法直接访问该浏览器进程的 PID。

    目前我唯一能想到的就是创建另一个子进程,您可以在其中运行 ps 或 pgrep 等命令。然后您可以解析该命令的输出以查找正在运行的浏览器的 PID作为 xdg-open 的孩子。有一个读取子进程输出的例子here

    【讨论】:

    • 我不这么认为。子进程将运行 xdg-open。但是,如果我理解正确,浏览器将在另一个进程中打开。所以PID会不同。
    • @elena: From man 3 exec: The exec() family of functions replaces the current process image with a new process image. 由于执行替换,不需要创建新进程,因此不会分配新的进程ID。
    • 是的,我阅读了手册页。但是,如果您查看我的示例:execlp("/usr/bin/xdg-open", "xdg-open", url, NULL),您会看到 xdg-open 是替换的进程映像。 xdg-open 反过来会打开浏览器(因为 url 是一个 html 页面)。浏览器将在新进程中运行。所以我需要这个进程的PID。
    【解决方案2】:

    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
    }
    

    【讨论】:

      猜你喜欢
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-10
      • 1970-01-01
      • 2021-08-08
      • 2016-01-31
      相关资源
      最近更新 更多