【问题标题】:Open a process from file, in C++ on Linux在 Linux 上用 C++ 从文件中打开一个进程
【发布时间】:2012-10-02 22:01:04
【问题描述】:

我正在 Linux 上用 C++ 编写我的应用程序。 C++ 有一个名为“system”的函数来执行程序。

我尝试像这样从 C++ 打开 gnome-system-monitor:

system("gnome-system-monitor");

但是,当我调用这个“系统”函数时,我的应用程序的线程会阻塞,直到我关闭 gnome-system-monitor 的窗口。

还有其他方法可以在不阻塞调用者进程的情况下从文件中打开进程吗?

【问题讨论】:

  • 那将是fork() 后跟exec() 函数之一,但这更底层和复杂。
  • 你应该用fork/exec创建子进程,在子进程中执行gnome-system-monitor。

标签: c++ linux process system gnome


【解决方案1】:

适用于任何 Linux 或其他基于 POSIX 的系统的经典方法是

if (0 == fork()) {
  execlp("gnome-system-monitor", "gnome-system-monitor", (char *)NULL);
}

(此示例中省略了错误处理。)这(a)创建一个新进程,(b)在该新进程中,在搜索 PATH 环境变量以找到这样的命令后运行“gnome-system-monitor”, (c) 将名称“gnome-system-monitor”作为 argv[0] 传递给它,并且没有其他参数。在父进程中,一旦创建了新进程,它就会继续前进,而无需等待任何结果。

有关更多详细信息,请参阅 forkexeclp 的手册页。

【讨论】:

  • 调用execlp后怎么我的调用线程停止执行
  • 调用execlpexec 家族中的任何一个的进程将其程序完全替换为新的——参见the man page。这就是为什么你想在打电话之前fork。这是你的意思,还是别的什么?
  • 似乎 fork 无法创建进程,之后调用 'exec' 替换了我现有的进程
  • 你在检查fork的返回值吗?当它失败时,它返回 -1 -- 参见the man page。成功时,同时返回原始(父)进程和新(子)进程;您区分的方式是它返回 0 给孩子并将孩子的 PID(大于 0)返回给父母。您只想在孩子中 exec,即当它返回 0 时。
【解决方案2】:

fork/exec 或 posix_spawn。如果你正在使用 glib,glib 也有 GSpawn。

【讨论】:

    【解决方案3】:

    Gnome 构建在 GTk(包含 Glib)之上,您可能需要 Glib Spawning Processes 函数。

    当然,在 Linux 和 Unix 上,processesforked。读一本好书,比如 advanced unix programmingadvanced linux programming 了解更多与流程相关的 syscalls,尤其是 fork(2)execve(2)pipe(2)。另请阅读proc(5) 文件系统。

    【讨论】:

      【解决方案4】:

      是的。在单独的线程上调用系统函数。

      【讨论】:

        猜你喜欢
        • 2013-01-07
        • 2011-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-17
        • 2018-02-13
        • 2015-06-26
        • 2013-01-12
        相关资源
        最近更新 更多