我有两个用Ubuntu构建的C ++程序,我想同时运行它们。我不想将它们组合成一个C ++项目并在不同的线程上运行它们,因为这会给我带来各种各样的问题。
我有效地想要模拟的解决方案是,当我在终端中打开两个选项卡,并在单独的选项卡中运行每个程序。但是,我还想要一个程序(让我们称之为程序A)能够退出并重新运行其他程序(程序B)。这不能仅在终端中实现。
所以我想要做的是在程序A中编写一些C ++代码,它可以在任何时候运行并退出程序B.两个程序必须同时运行,因此程序A不必等到程序B返回,然后继续执行程序A.
有什么想法吗?谢谢!
答案 0 :(得分:3)
这里有多个选项:
如果这很重要,Boost和Qt也提供了很好的方法来操纵子进程的标准输入/输出。如果不是经典的POSIX意味着应该做得很好。
答案 1 :(得分:2)
查看Linux操作系统调用fork()
和exec()
。 fork()
调用将创建当前进程的两个副本,这些副本将继续同时执行。
fork()
的返回值是PID(进程ID)
孩子的过程。fork()
的返回值为0. fork()
的返回值为-1。您可以利用此优势来控制父级和子级的行为。举个例子:
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
int main(int argc,char** argv)
{
char* progB = "/bin/progB";
char* args[progName, "arg1", "arg2", ..., NULL];
char* env[NULL]; // can fill in environment here.
pid_t pid=fork();
if (pid==0)
{
// In child...
execv(progB, args, env);
}
else if (pid == -1)
{
// handle error...
}
else
{
// In parent; pid is the child process.
// can wait for child or kill child here.
}
}
要等到您的孩子退出(在上面的第三种情况下),您可以使用wait(2),在成功终止时返回您的子pid,或者在错误时返回-1:
pid_t result = waitpid(pid, &status, options);
为了先发制人地杀死你的孩子,你可以按照kill(2)中的描述发送一个终止信号:
int result = kill(pid, SIGKILL); // or whatever signal you wish
这应该允许您按照原始问题中的描述管理您的流程。