同时运行两个程序

时间:2015-08-26 10:18:57

标签: c++ linux multithreading ubuntu concurrency

我有两个用Ubuntu构建的C ++程序,我想同时运行它们。我不想将它们组合成一个C ++项目并在不同的线程上运行它们,因为这会给我带来各种各样的问题。

我有效地想要模拟的解决方案是,当我在终端中打开两个选项卡,并在单独的选项卡中运行每个程序。但是,我还想要一个程序(让我们称之为程序A)能够退出并重新运行其他程序(程序B)。这不能仅在终端中实现。

所以我想要做的是在程序A中编写一些C ++代码,它可以在任何时候运行并退出程序B.两个程序必须同时运行,因此程序A不必等到程序B返回,然后继续执行程序A.

有什么想法吗?谢谢!

2 个答案:

答案 0 :(得分:3)

这里有多个选项:

  1. 传统的POSIX fork / exec(有很多关于如何在SO中执行此操作的示例,例如this一个。)
  2. 如果您可以使用Boost,则可以选择Boost process
  3. 如果您可以使用Qt,那么QProcess是一个选项。
  4. 如果这很重要,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

这应该允许您按照原始问题中的描述管理您的流程。