现在,我正在开发一个项目,我需要启动一个子进程来使用C ++在Linux中执行一个新程序,我需要重定向标准输入和输出(如在C ++中,它们是{{ 1}}和cin
)到一个文件。这意味着在子进程中,标准输入和输出都是文件。子进程将读取文件(其名称为cout
)的输入,并输出到文件(其名称为input.txt
)。
通过使用output.txt
和cin.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
;
答案 0 :(得分:1)
您需要在孩子0
之后重定向文件描述符1
(标准输入)和fork()
(标准输出):
switch (fork()) {
case 0: {
close(0);
if (open(name, O_RDONLY) < 0) {
deal_with_error();
}
...
您可能希望打开父进程中指向的文件。容易打开文件可能会使错误处理更容易。在这种情况下,您将使用dup2()
将正确的文件描述符与文件相关联。