我在 Linux 上用 C++ 编写我的应用程序。C++ 有一个称为“系统”的函数来执行程序。
我尝试像这样从 C++ 打开 gnome-system-monitor:
system("gnome-system-monitor");
但是,当我调用这个“系统”函数时,我的应用程序的线程会阻塞,直到我关闭 gnome-system-monitor 的窗口。
还有其他方法可以在不阻塞调用者进程的情况下从文件打开进程吗?
适用于任何 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] 传递给它,并且没有其他参数。在父进程中,一旦创建了新进程,它就会继续前进,而无需等待任何结果。
有关详细信息fork
,请参见手册页。execlp
fork/exec 或 posix_spawn。如果您正在使用 glib,glib 也有 GSpawn。
Gnome 构建在 GTk(包含 Glib)之上,您可能需要Glib Spawning Processes函数。
当然,在 Linux 和 Unix 上,进程是分叉的。阅读一本好书,例如 高级 unix 编程和高级 linux 编程,以了解有关与进程相关的系统调用的更多信息,尤其是fork(2)、execve(2)、pipe(2)。另请阅读有关proc(5)文件系统的信息。
是的。在单独的线程上调用系统函数。