문제

코드를 'Less'유틸리티, 특히 키보드 입력을 얻는 방법에 대한 코드를 살펴보고 있습니다. 흥미롭게도 Ttyin.c의 80 행에서 파일 디스크립터가 다음에서 읽도록 설정합니다.

     /*
      * Try /dev/tty.
      * If that doesn't work, use file descriptor 2,
      * which in Unix is usually attached to the screen,
      * but also usually lets you read from the keyboard.
      */
  #if OS2
      /* The __open() system call translates "/dev/tty" to "con". */
      tty = __open("/dev/tty", OPEN_READ);
  #else
      tty = open("/dev/tty", OPEN_READ);
  #endif
      if (tty < 0)
          tty = 2;

파일 디스크립터 2 stderr가 아닌가? 그렇다면, wth?! 키보드 입력이 Stdin을 통해 전송되었다고 생각했습니다.

흥미롭게도, 당신이 그렇게하더라도 ls -l * | less, 파일이로드가 끝나면 키보드를 사용하여 위아래로 스크롤 할 수 있지만 ls -l * | vi, 그런 다음 VI는 Stdin에서 읽지 않기 때문에 당신에게 소리를지를 것입니다. 큰 아이디어는 무엇입니까? Stderr가 화면에 오류를보고하고 키보드에서 읽는 방법 인이 이상한 새 땅에서 어떻게 끝났습니까? 더 이상 캔자스에 있다고 생각하지 않습니다 ...

도움이 되었습니까?

해결책

$ ls -l /dev/fd/
lrwx------ 1 me me 64 2009-09-17 16:52 0 -> /dev/pts/4
lrwx------ 1 me me 64 2009-09-17 16:52 1 -> /dev/pts/4
lrwx------ 1 me me 64 2009-09-17 16:52 2 -> /dev/pts/4

인터 레이트 터미널에 로그인하면 세 개의 표준 파일 설명자가 동일한 것을 가리 킵니다 : tty (또는 pseudo-tty).

$ ls -fl /dev/std{in,out,err}
lrwxrwxrwx 1 root root 4 2009-09-13 01:57 /dev/stdin -> fd/0
lrwxrwxrwx 1 root root 4 2009-09-13 01:57 /dev/stdout -> fd/1
lrwxrwxrwx 1 root root 4 2009-09-13 01:57 /dev/stderr -> fd/2

컨벤션에 의해, 우리는 읽습니다 0 그리고 글을 쓰십시오 1 그리고 2. 그러나 우리가 달리 행동하지 못하게하는 것은 없습니다.

쉘이 작동 할 때 ls -l * | less, 그것은 파이프를 만듭니다 ls의 파일 설명 자 1 에게 less의 파일 설명 자 0. 확실히, less 파일 디스크립터에서 더 이상 사용자의 키보드 입력을 읽을 수 없습니다. 0 - 그러나 할 수는 있지만 TTY를 되 찾으려고합니다.

만약에 less 터미널에서 분리되지 않았으며 open("/dev/tty") tty를 줄 것입니다.

그러나 실패한 경우 ... 무엇을 할 수 있습니까? less 해당 파일 디스크립터를 가정하면 TTY를 얻는 데 마지막 시도를합니다. 2 파일 디스크립터와 동일한 것에 첨부됩니다 0 리디렉션되지 않은 경우에 첨부됩니다.

이것 아니다 실패 :

$ ls -l * | setsid less 2>/dev/null

여기, less 자체 세션이 제공됩니다 (따라서 더 이상 터미널의 활성 프로세스 그룹의 일부가 아니므로 open("/dev/tty") 실패) 및 해당 파일 디스크립터 2 이제 변경되었습니다 - 지금 less tty로 출력되지만 사용자 입력을 얻지 못하므로 즉시 종료됩니다.

다른 팁

글쎄 ... 우선, 당신은 open() '/dev/tty'가 열리는 전화. Open ()가 실패한 경우 파일 디스크립터 2 만 사용합니다. 표준 Linux 시스템 및 아마도 많은 유엔에서 '/dev/tty'가 존재하며 실패를 일으키지 않을 것입니다.

둘째, 상단의 의견은 왜 그들이 파일 설명 자로 돌아가는 지에 대한 제한된 양의 설명을 제공합니다. stdin, stdout, 그리고 stderr 리디렉션되지 않는 한 어쨌든 '/dev/tty/'에 거의 연결되어 있습니다. 그리고 stdin 및/ 또는 stdout에 대한 가장 일반적인 리디렉션 (배관 또는 < / >), 그러나 덜 자주 stderr, 승률은 사용 중입니다 stderr 여전히 "키보드"에 연결될 가능성이 높습니다.

궁극적으로 요청한 사람의 답변과 같은 질문 Linuxquestions 비록 그들은 약간 다른 소스를 인용하지만 less. 그리고 아니, 나는 그것을 대부분 이해하지 못해서 그 이상으로 도울 수 없다 :)

키보드 입력을 FD 2로 보내는 Linux 특정 기능으로 보입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top