C программой для выполнения трубы на три команды
Мне нужно написать программу, которая будет выполнять ту же операцию, что и du | сортировать | голову в командной строке сделаю, но я застрял, и моя программа не работает. Выход прямо сейчас 112 . и программа не заканчивается. Пожалуйста, помогите, я не знаю, что делать!
int main(void) {
int fd[2];
int fd1[2];
int pid;
if (pipe(fd) == -1) {
perror("Pipe");
exit(1);
}
switch (fork()) {
case -1:
perror("Fork");
exit(2);
case 0:
dup2(fd[1], STDOUT_FILENO);
close(fd[0]);
close(fd[1]);
execl("/usr/bin/du", "du", (char *) 0);
exit(3);
}
if (pipe(fd1) == -1) {
perror("Pipe");
exit(1);
}
switch (fork()) {
case -1:
perror("Fork");
exit(2);
case 0:
dup2(fd[0], STDIN_FILENO);
dup2(fd1[1], STDOUT_FILENO);
close(fd[0]);
close(fd[1]);
close(fd1[0]);
close(fd1[1]);
execl("/usr/bin/sort", "sort", (char *) 0);
exit(3);
}
close(fd[0]);
close(fd[1]);
switch (fork()) {
case -1:
perror("Fork");
exit(2);
case 0:
dup2(fd1[0], STDIN_FILENO);
close(fd1[0]);
close(fd1[1]);
execl("/usr/bin/head", "head", (char *) 0);
exit(3);
}
}
1 ответ
Пусть head будет вашим родительским процессом, sort - его дочерним процессом, а du - дочерним процессом иливнукомголовы.
Вам нужны две трубы, таким образом, два массива - fd и fd1. Пусть fd pipe соединяетsort с головой, а fd1 - du с sort.
Вам понадобится один большой оператор switch, который будет определять, находитесь ли вы в родительском процессе (head, pipe (fd) не равен 0) или в дочернем (sort, pipe (fd) равен 0). Если вы всортировке, вам нужно создать канал fd1 и запустить процесс grandchild du. Теперь, поскольку у вас снова есть два процесса (всего три), вам нужно установить канал в соответствии с вашим местоположением - независимо от того, являетесь ли вы внуком или дочерним процессом. Вы можете использовать тот же оператор switch, что и для pipe fd. Хитрость здесь в том, чтобы правильно установить вход и выход для канала fd1.
Ваш код должен сделать что-то вроде этого:
int main(void) {
int fd[2]; // sort <===> head
int fd1[2]; // du <===> sort
pipe(fd);
switch (fork()) {
case 0: // Are we in sort?
pipe(fd1); // If yes, let's make a new pipe!
switch (fork()) {
case 0: // Are we in du?
dup2(fd1[1], STDOUT_FILENO);
close(fd1[0]);
close(fd1[1]);
execl("/usr/bin/du", "du", (whatever directory), NULL);
exit(1);
default:
/* If not in du, we're in sort! in the middle!
Let's set up both input and output properly.
We have to deal with both pipes */
dup2(fd1[0], STDIN_FILENO);
dup2(fd[1], STDOUT_FILENO);
close(fd1[0]);
close(fd1[1]);
execl("/usr/bin/sort", "sort (flags if needed)", (char *) 0);
exit(2);
}
exit(3);
default: // If we're not in sort, we're in head
dup2(fd[0], STDIN_FILENO);
close(fd[0]);
close(fd[1]);
execl("/usr/bin/head", "head (flags if needed)", (char *) 0);
exit(4);
}
}