"dmesg | more" 실행 도중에 more에서 사용자 입력(stdin)을 받을 수 있는 이유
글쓴이: gyxor / 작성시간: 일, 2006/11/05 - 1:03오전
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을 생성한것인가요?
답변부탁드립니다
Forums:
Quote: After a successful
파일 디스크립터를 복제(duplicate)하는 함수라서 그러는 것 같습니다. 다른 함수를 쓰셔야겠네요..
dup2()후에 표준입력을
dup2()후에 표준입력을 닫아주시면 될듯한데요?
close(0);
댓글 달기