我已经做了这个任务+3周了,我确信这对那里的人来说是件小事,所以我只想问一下是否有人可以给我写一些带有这些要求的示例代码:
cat inputfile.cpp | ./program01 ./program02
这样调用(我认为)。我想说的是(我认为):“使用程序program01和program02”对文件inputfile.cpp进行修改。我的问题有意义吗?我的意思是,管道是否意味着以这种方式使用(首先运行其他程序然后另一个程序)?
我是否可以通过多个程序运行多个文件,例如cat input1.cpp input2.cpp input3.cpp | ./program01 ./program02 ./program03
。
我已经编写了一堆程序,可以对文件执行各种操作,但这不是任务的主要内容。主要的是“管道”部分,但我真的,真的只是没有得到它。
感谢任何指导(下面的一些代码)。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include "programs.h"
int main(int argc, char** argv)
{
int fd[2];
pid_t pid;
int result;
result = pipe(fd);
if(result < 0)
{
perror("pipe error");
exit(1);
}
pid = fork();
if(pid < 0)
{
perror("fork error");
exit(2);
}
// Child
if(pid == 0)
{
while(1)
{
// I guess I should do some piping-magic here?
}
exit(0);
}
// Parent
else
{
while(1)
{
}
exit(0);
}
}
答案 0 :(得分:2)
我认为您将bash pipe命令与管道混淆以获取IPC。 在bash中,管道不传递参数,但是将命令的stdout重定向到stdin的下一个命令。所以在你的c ++程序中,你应该从stdin读取并写入stdout(relevant stackoverflow question)。 你可以做点什么
cat file | ./program1 > file
连锁节目
cat file | ./program1 | ./program2 > file
答案 1 :(得分:2)
要处理来自shell管道的数据,您只需读取std::cin
中的数据并将结果输出到std::cout
。 shell管理实际的管道。
这是一个什么都不做的程序。它简单地将数据从传入的“管道”传递到传出的“管道”:
使用“管道”不做任何事情:
#include <iostream>
int main()
{
char c;
while(std::cin.get(c))
std::cout.put(c);
}
删除每个空白行的程序:
#include <iostream>
#include <string>
int main()
{
std::string line;
while(std::getline(std::cin, line))
{
if(line.empty()) // skip empty lines
continue;
// otherwise send them out
std::cout << line << '\n';
}
}