如何让一个 c++ 程序在 Linux 中打开另一个程序?它类似于在 Windows 中使用 shell 命令吗?
5 回答
有一个标准的 C 函数,system()
它运行一个命令并等待它完成。
有一个标准的 POSIX 函数,popen()
它在新进程中运行命令并返回连接到新进程的管道。管道通常是单向的,它既可以读也可以写(一些平台,例如 BSD 允许双向管道)
或者您可以手动执行此操作,方法是使用 POSIX 函数fork()
派生一个新进程,然后使用其中一个exec()
家族来用不同的程序替换进程映像。
我认为迄今为止最简单的首选方法是使用我的Pstreams库。这会在新进程中运行命令,并使用与 iostreams 兼容的接口将管道连接到它的任何stdin
,和 。与 &相比,这为您提供了更少的控制(但更简单),但比.stdout
stderr
fork
exec
popen
您可以使用exec函数之一:http: //www.kernel.org/doc/man-pages/online/pages/man3/exec.3.html
您可以使用system()
标准库调用,它与 Windows Shell 命令非常相似。要获得更多控制,您可以使用exec()
及其变体。
使用execl()
功能。它适用于 C 语言,但应该可以正常工作。有关铁道部信息和一些示例,请查看以下内容: http: //www.gidforums.com/t-3369.html
通常,您首先使用功能fork启动另一个进程,然后exec将新进程正在运行的程序(即要启动另一个程序的程序)与您要启动的程序交换。代码大致如下所示:
pid_t pid = fork();
switch(pid) {
case 0: // we are the child process
exec( name of exectuable ); //exact signautre differs
break;
case -1: //An error ocurred
std::cout << "error\n";
}
Fork 克隆您正在运行的进程。它们绝对相同,甚至运行相同的程序。唯一的区别是返回的 pid。调用进程获取孩子的pid,孩子得到零。switch 语句决定了其中的哪一个。Exec 将进程正在运行的程序替换为另一个程序。据我所知,它只保留文件描述符。Exec 有几个关于参数和搜索路径的变体,在手册页中查找它们。