1
在這種格式給出的命令:管道問題(斷管)
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。爲什麼我的管子壞了,我該如何解決這個問題?
您確定您的意思是「usr/bin/cat」而不是「/ usr/bin/cat」嗎? –
此外,您的程序有一個邏輯錯誤:在執行成功的'exec'調用後它不會繼續。你忘了「叉」嗎? –
是的,我打算做「/ usr/......」。我是否使用fork()以避免邏輯錯誤? –