给出这种格式的命令:
cat < inputfile.txt | tee outputfile.txt
我正在尝试将inputfile.txt写入管道,然后从管道中读取outputfile.txt,并且我已经编写了以下函数来执行此操作:
void piperead(char** input, int* fd, int start) {
dup2(fd[0], 0);
close(fd[1]);
execl("usr/bin/tee", "usr/bin/tee", input[start + 1], NULL);
}
void pipewrite(char** input, int* fd, int start, int end) {
dup2(fd[1], 1);
close(fd[0]);
execl("usr/bin/cat", "usr/bin/tee", input[start + 2], NULL);
}
void dopiping(char** input, int start, int end) {
int fd[2];
if (pipe(fd) == -1) {
cout << "Error: Pipe failed." << endl;
exit(1);
}
int pid = fork();
switch(pid = fork()) {
case 0:
piperead(input, fd, start, end);
default:
pipewrite(input, fd, end + 1);
case -1:
exit(1);
}
}
我已将命令转换为c_strings数组(让我们称之为cmdarray),然后我调用dopiping(cmdarray,0,3)。程序到达该行的那一刻:
dup2(fd[1], 1)
程序终止,因为程序收到了SIGPIPE。为什么我的管道坏了,我该如何解决?
答案 0 :(得分:1)
从逻辑上看这个
fd[0]
dup2()
execl()
失败了 - 你应该尝试指定&#34; / usr / bin / tee&#34; (完整路径不是相对路径)tee
失败 - 需要确保input[start+1]
指向表示有效文件路径的以空字符结尾的字符串。