ссылаясь на старый вопрос о домашней задаче: /* implementing "/usr/bin/ps -ef | /usr/bin/more" */
с использованием труб.Как execv получает выход из трубы?
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
int fds[2];
int child[2];
char *argv[3];
pipe(fds);
if (fork()== 0) {
close(fds[1]);
close(STDIN_FILENO); dup(fds[0]); /* redirect standard input to fds[1] */
argv[0] = "/bin/more";
argv[1] = NULL; /* check how the argv array is set */
execv(argv[0], argv);// here how execv reads from stdin ??
exit(0);
}
if (fork() == 0) {
close(fds[0]);
close(STDOUT_FILENO); dup(fds[1]); /* redirect standard output to fds[0] */
argv[0] = "/bin/ps";
argv[1] = "-e"; argv[2] = NULL;
execv(argv[0], argv);
exit(0);
}
close(fds[1]);
wait(&child[0]);
wait(&child[0]);
}
После перенаправления fd на стандартный вывод, как работает execv от него. Является ли встроенным в execv, что он читает со стандартного ввода перед выполнением команды? Я не могу получить эту концепцию.
Спасибо, сэр! Правильно. Я думал не в том направлении. Теперь я понял. Вот почему команда типа «ps | ls» будет печатать только выходные данные ls. – dejavu