Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在新终端中使用exec启动新程序_C++_C_Linux_Unix - Fatal编程技术网

C++ 在新终端中使用exec启动新程序

C++ 在新终端中使用exec启动新程序,c++,c,linux,unix,C++,C,Linux,Unix,我有一个名为pgm1的程序,它使用fork创建一个新进程 然后在此过程中,我使用以下命令启动一个新程序(pgm2): execv(execpath\u name,argv) 但问题是,用这个方法,我在同一个终端上得到了两个输出。 我已经搜索了一段时间,我找到的唯一解决方案是: 使用系统调用打开新的终端 使用此软件将我的pgm2连接到新终端 所以我的问题很简单,有没有更简单的方法 提前谢谢 PS:Distro-Ubuntu11.10 32位我可以想出两种可能的解决方案: 做正确的事情(TM)并

我有一个名为pgm1的程序,它使用fork创建一个新进程

然后在此过程中,我使用以下命令启动一个新程序(pgm2): execv(execpath\u name,argv)

但问题是,用这个方法,我在同一个终端上得到了两个输出。 我已经搜索了一段时间,我找到的唯一解决方案是:

  • 使用系统调用打开新的终端
  • 使用此软件将我的pgm2连接到新终端
所以我的问题很简单,有没有更简单的方法

提前谢谢


PS:Distro-Ubuntu11.10 32位

我可以想出两种可能的解决方案:

  • 做正确的事情(TM)并将您的输出发送到一个文件:每个进程可以使用不同的文件,提供输出的清晰分离和更好的记录保存。作为奖励,您也一定会看到性能的提高-即使在今天,终端输出在计算上也是昂贵的

  • 使用正确的参数执行终端仿真器:大多数终端仿真器提供了一种代替shell执行特定程序的方法。例如
    xterm

    $ xterm top
    
    这将在无外壳的
    xterm
    实例中启动
    top
    。退出
    top
    也会终止
    xterm
    窗口

    如果您选择的终端仿真器支持此功能,则只需修改传递给
    execv()
    的参数即可使用它。当然,在这种情况下,您将实际执行终端仿真器,而不是您的程序,该程序将调用您自己的进程

    请记住,根据终端仿真器的不同,任何打开的文件描述符都可能无法正确传递到您的程序-终端至少会损坏标准文件描述符


  • 你真的想启动一个新的终端吗?是的,这就是我想要的,每个程序一个终端。那么
    $bash-cprg1
    呢?执行它。我认为这不适合我的代码,因为我确实需要使用execv启动我的程序,原因很少。你的pgm2在做什么?为什么您不能
    popen
    它或使用多个
    管道
    -s?为什么你真的需要另一个终端?第一个解决方案似乎是正确的,你给出的论点说服了我这么做。但如何将这些文件显示到不同的终端?使用系统调用:tail-f@Atha:如果您觉得有必要,您可以使用第二种解决方案启动windows,使用
    less
    tail-f
    。。。