在子进程中更改iostreams

时间:2012-12-06 04:29:51

标签: c++ linux fork iostream

现在,我正在开发一个项目,我需要启动一个子进程来使用C ++在Linux中执行一个新程序,我需要重定向标准输入和输出(如在C ++中,它们是{{ 1}}和cin)到一个文件。这意味着在子进程中,标准输入和输出都是文件。子进程将读取文件(其名称为cout)的输入,并输出到文件(其名称为input.txt)。

通过使用output.txtcin.rdbuf(),我实际上可以在父进程中重定向cout.rdbuf()cin。但是当子进程启动cout命令时,它不起作用。似乎在子进程执行execl()命令后,标准输入和输出恢复正常。

任何人都可以帮我解决这个问题吗?过去几天我一直很困惑,无法找到出路。

代码如下:

// main.cpp中

execl()

// executor.cpp

#include<sys/types.h>
#include<sys/time.h>
#include<sys/wait.h>
#include<sys/ptrace.h>
#include<sys/syscall.h>
#include<string>
#include"executor.cpp"
int main(int argc, char*argv[])
{
executor ex;
ex.set_path("/home/test");
ex.run_program();
}

P.S。 #include<sys/types.h> #include<sys/time.h> #include<sys/wait.h> #include<sys/ptrace.h> #include<sys/syscall.h> #include<string.h> #include<unistd.h> #include<iostream> #include<fstream> using namespace std; class executor{ public: void run_program() { char p[50]; strcpy(p,path.c_str()); cpid = fork(); if(cpid == 0) { ifstream file("/home/openjudge/data.txt"); if(!file) cout<<"file open failed\n"; streambuf* x = cin.rdbuf(file.rdbuf()); ptrace(PTRACE_TRACEME,0,NULL,NULL); execl(p,"test","NULL); cin.rdbuf(x); cout<<"execute failed!\n"; } else if(cpid > 0) { wait(NULL); cout<<"i'm a father\n"; } } void set_path(string p) { path = p; } private: int cpid; string path; }; 是一个简单的程序,从/home/test读取并输出到cin;

1 个答案:

答案 0 :(得分:1)

您需要在孩子0之后重定向文件描述符1(标准输入)和fork()(标准输出):

switch (fork()) {
case 0: {
    close(0);
    if (open(name, O_RDONLY) < 0) {
        deal_with_error();
    }
    ...

您可能希望打开父进程中指向的文件。容易打开文件可能会使错误处理更容易。在这种情况下,您将使用dup2()将正确的文件描述符与文件相关联。