/ / Как execv получава изхода от тръба? - c, операционна система, execv

Как execv получава изхода от тръбата? - c, операционна система, execv

позовавайки се на стария домашен въпрос: /* 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.