3

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

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

谁能帮我解决这个问题?这几天我一直很迷茫,找不到出路。

代码如下:

//main.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();
}

//executor.cpp

#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;
};

PS/home/test是一个简单的程序,它读取cin并输出到cout;

4

1 回答 1

1

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

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

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

于 2012-12-06T07:24:44.617 回答