同时运行两个程序

Running two programs concurrently

本文关键字:两个 程序 运行      更新时间:2023-10-16

我在Ubuntu中内置了两个c++程序,我想同时运行它们。我不想把它们合并到一个c++项目中,并在不同的线程上运行它们,因为这会给我带来各种各样的问题。

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

所以我想做的是在程序A中写一些c++代码,它可以在任何时候运行和退出程序B。两个程序必须并发运行,这样程序A就不必等到程序B返回后再继续执行程序A。

任何想法?谢谢!

在Linux中,您可以fork当前进程,这将创建一个新进程。然后,您必须使用exec系统调用启动新进程。

是指:http://man7.org/linux/man-pages/man2/execve.2.html

例如:

#include <unistd.h> /* for fork */
#include <sys/types.h> /* for pid_t */
#include <sys/wait.h> /* for wait */
int main(int argc,char** argv)
{
    pid_t pid=fork();
    if (pid==0)
    {
      execv("/bin/echo",argv);
    }
}

这里有多个选项:

  1. 传统的POSIX fork/exec(有很多关于如何在SO中这样做的例子,例如这个)。
  2. 如果你可以使用Boost,那么Boost进程是一个选项。
  3. 如果你可以使用Qt,那么QProcess是一个选项。
Boost和Qt也提供了很好的方法来操作子进程的标准输入/输出,如果这很重要的话。如果不是经典的POSIX方式应该做得很好。

看一下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

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