这个问题源于我尝试实现以下指令:
我非常确定上述字符串已经被正确初始化。但是,有两件事情发生了,让我感到很困惑:
(1) 我执行的程序报告说“输入文件为空”。既然我没有使用 "<" 调用程序,它就不应该期望有输入文件。相反,它应该期望键盘输入。此外,它应该读取 "gulp_command" 中包含的文本。
(2) 程序的报告(通过标准输出提供)出现在终端上。这很奇怪,因为这个管道的目的是将 stdout 传输到我的字符串 "receive_output" 中。但是由于它出现在屏幕上,这表明信息没有正确地通过管道传递到变量中。如果我在 if 语句的末尾实现以下内容,
因此,我的代码目前使用:
Linux Pipes as Input and Output
How to send a simple string between two programs using pipes?
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) 程序的报告(通过标准输出提供)出现在终端上。这很奇怪,因为这个管道的目的是将 stdout 传输到我的字符串 "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");
我希望使用管道来替换这个过程。我想将我的输入作为标准输入传递给程序,并将程序的标准输出读入到一个字符串中。
/directory/program <input.txt >output.txt
,以避免文件系统访问。但是你需要多个进程才能使用管道。虽然你可以在单个进程中使用管道,但通常没有意义。因此,你可能会使用/directory/program1 <input.txt | /directory/program2 >output.txt
;这是有意义的(之前你可能已经使用了/directory/program1 <input.txt >intermediate.txt; /directory/program2 <intermediate.txt >output.txt
)。请澄清你的意图。 - Jonathan Leffler