这个问题源于我尝试执行以下指令:
http://tldp.org/LDP/lpg/node11.html
我的问题类似于:Linux Pipes as Input and Output中的问题,但更具体。
本质上,我正在尝试替换:
/directory/program < input.txt > output.txt
在 C++ 中使用管道以避免使用硬盘驱动器。这是我的代码:
//LET THE PLUMBING BEGIN
int fd_p2c[2], fd_pFc[2], bytes_read;
// "p2c" = pipe_to_child, "pFc" = pipe_from_child (see above link)
pid_t childpid;
char readbuffer[80];
string program_name;// <---- includes program name + full path
string gulp_command;// <---- includes my line-by-line stdin for program execution
string receive_output = "";
pipe(fd_p2c);//create pipe-to-child
pipe(fd_pFc);//create pipe-from-child
childpid = fork();//create fork
if (childpid < 0)
{
cout << "Fork failed" << endl;
exit(-1);
}
else if (childpid == 0)
{
dup2(0,fd_p2c[0]);//close stdout & make read end of p2c into stdout
close(fd_p2c[0]);//close read end of p2c
close(fd_p2c[1]);//close write end of p2c
dup2(1,fd_pFc[1]);//close stdin & make read end of pFc into stdin
close(fd_pFc[1]);//close write end of pFc
close(fd_pFc[0]);//close read end of pFc
//Execute the required program
execl(program_name.c_str(),program_name.c_str(),(char *) 0);
exit(0);
}
else
{
close(fd_p2c[0]);//close read end of p2c
close(fd_pFc[1]);//close write end of pFc
//"Loop" - send all data to child on write end of p2c
write(fd_p2c[1], gulp_command.c_str(), (strlen(gulp_command.c_str())));
close(fd_p2c[1]);//close write end of p2c
//Loop - receive all data to child on read end of pFc
while (1)
{
bytes_read = read(fd_pFc[0], readbuffer, sizeof(readbuffer));
if (bytes_read <= 0)//if nothing read from buffer...
break;//...break loop
receive_output += readbuffer;//append data to string
}
close(fd_pFc[0]);//close read end of pFc
}
我绝对确定上述字符串已正确初始化。但是,发生了两件事对我来说没有意义:
(1) 我正在执行的程序报告“输入文件为空”。由于我没有使用“<”调用程序,因此不应期待输入文件。相反,它应该期待键盘输入。此外,它应该阅读“gulp_command”中包含的文本。
(2) 程序的报告(通过标准输出提供)出现在终端中。这很奇怪,因为此管道的目的是将标准输出传输到我的字符串“receive_output”。但由于它出现在屏幕上,这向我表明信息没有通过管道正确传递到变量。如果我在 if 语句的末尾执行以下操作,
cout << receive_output << endl;
我什么也没得到,好像字符串是空的。我很感激你能给我的任何帮助!
编辑:澄清
我的程序当前使用文本文件与另一个程序通信。我的程序编写了一个文本文件(例如 input.txt),由外部程序读取。然后该程序生成 output.txt,由我的程序读取。所以它是这样的:
my code -> input.txt -> program -> output.txt -> my code
因此,我的代码目前使用,
system("program < input.txt > output.txt");
我想用管道替换这个过程。我想将我的输入作为标准输入传递给程序,并让我的代码将该程序的标准输出读入一个字符串。