"dmesg | more" 실행 도중에 more에서 사용자 입력(stdin)을 받을 수 있는 이유

gyxor의 이미지

      1 #include<stdio.h>
      2 
      3 int main()
      4 {
      5         int n;
      6         int p[2];
      7         char *arg1[] = {"dmesg", (char *)0};
      8         char *arg4[] = {"more", (char *)0};
      9 
     10         pipe(p);
     11 
     12         n = fork();
     13         if(n == 0)
     14         {
     15                 dup2(p[1], 1);
     16                 execvp(arg1[0], arg1);
     17         }
     18         else{
     19                 waitpid(n);
     20                 close(p[1]);
     21                 dup2(p[0], 0);   // <<----- stdin is replaced by p[0]
     22                 execvp(arg4[0] , arg4);
     23         }
     24         return 0;
     25 }

위 코드를 실행하면 dmesg | more 가 실행이 됩니다.

그런데
dmesg 의 출력(stdout)은 pipe의 input으로 dup시켰고
more의 입력(stdin)은 pipe의 output에서 받도록 dup 시켰습니다.
즉, more에서 stdin은 사라졌음에도
실행과정에서 사용자로부터 입력을 받는것을 볼 수 있는데요
이것이 가능한것은 어떻게 구현이 된것인가요? pipe로 부터 입력을 다 읽어들인 후에 새로 stdin을 생성한것인가요?
답변부탁드립니다

Prentice의 이미지

Quote:
After a successful return from dup() or dup2(), the old and new file descriptors may be used interchangeably.

파일 디스크립터를 복제(duplicate)하는 함수라서 그러는 것 같습니다. 다른 함수를 쓰셔야겠네요..
ckebabo의 이미지

dup2()후에 표준입력을 닫아주시면 될듯한데요?
close(0);