2014-04-27 29 views
1

我有两个C++程序:Program1和Program2。我想要做的是让Program1运行它的算法来计算它需要的任何内容,然后将所有计算的信息输入到Program2中,让它使用Program1的输出运行它的算法。C++中的子进程命令

如果我只需要管道信息并关闭Program1而不必等待Program2先完成,那将会很好。这将是像Python中的subprocess.call()

+0

您可能会发现http://www.highscore.de/boost/process/有用。但是,我从来没有用过它。如果解决方案不必是可移植的,那么旧的'fork'(甚至是'system')就可以做到。 –

+0

您可能会觉得有用的函数是:fork,exec,dup2,write,read。 – Till

+0

使用['popen(3)'](http://linux.die.net/man/3/popen),听起来像它会适合您的需求。它比'pipe/fork/dup2/exec'组合更容易使用。 –

回答

1

你要沿着这行做一些事情:

#include <unistd.h> 

int main() { 
    // Do stuff for program1 
    int pipefds[2]; 
    if (pipe (pipefds)) 
    throw 1; 
    // Use ``write'' to send binary data to pipefds[0] 
    dup2 (pipefds[1], 0); 
    execl (/* Put the program2 arguments you want here. */); 
    return 1; 
} 

有了这一点,你需要的是有程序2读出所有的标准输入必要的数据,你就大功告成了。

+0

'dup2(pipefds [1],0)'确实......做了什么? – Richard

1

为了模拟subprocess.check_call("Program1 | Program2", shell=True) Python的通话时,您可以使用system(3) in C

/** $ gcc simple-pipe.c && ./a.out */ 
#include <sys/types.h> /* pid_t */ 
#include <unistd.h> 

int main(void) { 
    int fd[2]; /* pipe ends */ 
    pid_t pid = -1; 

    if (pipe(fd) == -1) 
    Report_error_and_exit("pipe"); 

    if ((pid = fork()) == -1) 
    Report_error_and_exit("fork"); 
    else if (pid == 0) { 
    /* child: run Program1, redirecting stdout to the pipe */ 
    is_child = 1; 
    Close(fd[0]); /* close unused read end of the pipe */ 

    /* redirect stdout */ 
    Redirect(fd[1], STDOUT_FILENO); 

    /* run Program1 with redirected stdout */ 
    execlp("Program1", "Program1", NULL); 
    Report_error_and_exit("execlp"); 
    } 

    /* parent: run Program2, redirecting stdin to the pipe */ 
    Close(fd[1]); /* close unused write end of the pipe */ 

    /* redirect stdin */ 
    Redirect(fd[0], STDIN_FILENO); 
    /* run Program2 with redirected stdin */ 
    execlp("Program2", "Program2", NULL); 
    Report_error_and_exit("execlp"); 
} 

其中Report_error_and_exit,关闭,重定向可能是:

/** $ gcc simple-pipe-system.c && ./a.out */ 
#include <stdlib.h> 

int main(void) { 
    return system("Program1 | Program2"); 
} 

下面介绍如何使用低级别pipe(2)/fork(2)/execlp(2) in C比较效仿Program1 | Program2管道定义为:

#include <errno.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#include <unistd.h> 

#define Close(FD) do {           \ 
    const int Close_fd = (FD);         \ 
    if (close(Close_fd) == -1)         \ 
     fprintf(stderr, "%s:%d: close(" #FD ") %d: %s\n",   \ 
      __FILE__, __LINE__, Close_fd, strerror(errno));  \ 
    }while(0) 

#define Report_error_and_exit(msg) do {      \ 
    fprintf(stderr, "%s:%d: %s: %s\n", __FILE__, __LINE__, \ 
     (msg), strerror(errno));        \ 
    (is_child ? _exit : exit)(EXIT_FAILURE);     \ 
    } while(0) 
static int is_child = 0; 

#define Redirect(FROM, TO) do {   \ 
    const int from = (FROM);    \ 
    const int to = (TO);     \ 
    if (from != to) {      \ 
     if (dup2(from, to) == -1)   \ 
     Report_error_and_exit("dup2");  \ 
     else         \ 
     Close(from);      \ 
    }          \ 
    } while(0)