позовавайки се на стария домашен въпрос: /* implementing "/usr/bin/ps -ef | /usr/bin/more" */
използвайки тръби.
#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 reads от него. Вграден ли е в execv, че чете от стандартния вход, преди да изпълни командата? Аз не мога да постигна тази концепция.
Отговори:
1 за отговор № 1Въпросът ви се основава на фалшива предпоставка - execv
не се чете от никъде, нито пък е необходимо more
който чете от stdin
тя наследява обаждането до execv
, Причината more
чете от stdin
е, защото е филтър и, както повечето филтри, той по подразбиране чете от stdin
ако друг входен източник не е посочен на командния ред (в противен случай, /usr/bin/ps -ef | /usr/bin/more
няма да работи.)
0 за отговор № 2
Във втората fork
обаждане, щях да променя кода от това:
if (fork() == 0) {
close(fds[0]);
до това:
close(fds[0]);
if (fork() == 0) {
Най- argv[1]
за ps
обаждане трябва да бъде -ef
.
Всички програми ще прочетат от stdin
за да получите терминален вход и да пишете на stdout
да предават данни на терминала, ако не правят нищо, за да променят настройките по подразбиране за тези потоци. Това, което правим, е промяната stdin
за more
и модифициране stdout
за ps
, Най- stdout
за more
е същото като текущия процес (родител). По този начин програмата ви пренасочва ps
изходните данни на терминала да бъдат терминалният вход за more
.
Най- pipe
повикването връща два дескриптора на файлове, които са свързани едно към друго еднопосочно. Кога ps
пише на него stdout
, то отива на dup
д fds[1]
, Кога more
чете от него stdin
, това е dup
д fds[0]
, Така, more
извежда продукцията на ps
.