Учитывая команду в следующем формате:проблем трубопроводов (Поврежденная труба)
cat < inputfile.txt | tee outputfile.txt
Я пытаюсь иметь inputfile.txt написать в трубу и затем OutputFile.txt считан из трубы, и я ве написал следующие fucntions сделать так:
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() во избежание логической ошибки? –