Может кто-нибудь объяснить мне, почему у моего вывода есть дубликаты в нем из команды ls. Нормальная работа ls -l | sort
не дает мне дублированный результат, так что может быть проблемой?Дублирование выходных труб
По сути, я пытаюсь передать вывод из одной команды и ввести ее в другую команду. Программа работает до сих пор, но на выходе отображаются повторяющиеся данные. Кроме того, и объяснение того, почему я должен был бы сделать закрытие после dup2 было бы действительно полезно :)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
// function declarations
void executeLs(int data_pipe[]);
void executeSort(int data_pipe[]);
int main(){
int data_pipe[2]; // array storing the file descriptors
int childls_pid; // ls child process
int childSort_pid; // sort child process
int rc; // return vaue of the pipe
int child_status1;
int child_status2;
rc = pipe(data_pipe);
if(rc == -1){
perror("pipe");
exit(1);
}
childls_pid = fork();
childSort_pid = fork();
// Ls Child process
switch(childls_pid) {
case -1:
perror("fork childLs Error");
exit(1);
case 0:
// inside of child process
executeLs(data_pipe);
exit(0);
default:
break;
}
// Sort child process
switch(childSort_pid) {
case -1:
perror("fork childSort Error");
exit(1);
case 0:
executeSort(data_pipe);
exit(0);
default:
wait(&child_status2);
}
return 0;
}
void executeLs(int data_pipe[]){
// Closes the read file descriptor
close(data_pipe[0]);
dup2(data_pipe[1], STDOUT_FILENO);
// confused as to why this is necessary
close(data_pipe[1]);
execlp("ls", "ls", "-1", NULL);
}
void executeSort(int data_pipe[]){
// close the write file descriptor
close(data_pipe[1]);
dup2(data_pipe[0], STDIN_FILENO);
close(data_pipe[0]);
execlp("sort","sort", NULL);
}
Вам нужно закрыть трубу FDs в родительском после того, как вы разветвите детей. – Barmar
Разве это не то, что я делаю внутри своей основной функции? Подожди, позволь мне понять это прямо. Если я закрываю свои трубы внутри моей дочерней процессии, это не закрывает функцию pipe внутри моего родительского процесса? – Xavier
Вы должны всегда вызывать '_exit' (не' exit') после неудачного 'exec' *. 'exit' сбрасывает буферы stdio. Если вы 'exec'ing, у вас текущий процесс, есть копия буферов stdio, которые никогда не предназначались для очистки. – PSkocik