클릭 TTY 장치가 다른 모든 문자만 캡처하는 이유는 무엇입니까?

클릭 TTY 장치가 다른 모든 문자만 캡처하는 이유는 무엇입니까?

그래서 저는 이 ttyname기능을 발견했습니다(unistd.h) 테스트를 거쳐야 합니다.

#include <unistd.h>
#include <stdio.h>

int main(void) {
  printf("%s\n", ttyname(0));
  return 0;
}

내 컴퓨터에서는 에코됩니다 /dev/ttys011. 알고보니 이게 장치였군요!

echo "Hello" > /dev/ttys011

와우, 다른 생성된 터미널에서 실행해 보세요안녕하세요내가 프로그램을 실행했던 원래 터미널에서 ttyname.

그러면 내가 이것을 하면 무슨 일이 일어날까요 cat /dev/ttys011? 알았어, 알았어다른 모든 역할유형. 아, 그렇습니다. 원래 TTY 세션도 파괴됩니다.

그래서 나는 다음을 시도합니다.

cat /dev/ttys011 | tee /dev/ttys011

글쎄, 모든 것나타나다원래 터미널에 있지만 내 "탭" 터미널(위 명령을 실행하는 터미널)은 여전히다른 모든 역할.

아, 그렇습니다. 내 원래 터미널은 여전히 ​​손상되었습니다(문자가 나타나지만 실제로는 다른 문자만 내 쉘에 도달합니다).

예를 들어, 터미널의 "탭" 터미널에 Yield를 입력하고 ls실행하면 .lsl'l' is not a command

여기서 무슨 일이 일어나고 있는 걸까요? 이상한 행동을 예상했는데 왜다른 모든 역할캡처되었나요?

답변1

쉘 또는 포그라운드에 있는 모든 프로세스는 이미 연결된 터미널을 읽고 있습니다. 즉, /dev/ttys011다른 프로세스를 시작합니다.cat 반품동일한 터미널에서 동시에 읽는 중입니다.

이제 터미널에서 동일한 입력을 놓고 경쟁하는 두 개의 프로세스가 있습니다. 터미널에 키를 입력할 때마다 대기 중인 프로세스 중 하나로 전달됩니다. 또 다른 프로세스도 읽기에 관심이 있지만 읽을 차례가 되면 읽을 것이 없습니다. 어떤 문자가 어떤 프로세스에 들어가는지 정기적으로 교대하는 것처럼 보이지만 실제로 입력의 어떤 부분이 어떤 프로세스에 들어갈지 예측하는 것은 불가능합니다. 모든 입력이 하나의 프로세스에 포함될 수도 있고, 모든 입력이 다른 프로세스에 포함될 수도 있습니다. 그 사이의 어떤 것.

프로세스가 모든 입력을 수신하도록 하려면 cat동일한 장치에서 동시에 다른 항목을 읽지 않도록 준비해야 합니다. 쉬운 방법은 sleep 999터미널에서 비슷한 명령을 실행하는 것입니다. sleep대기 지연이 만료되지만 기다리는 동안 아무것도 읽으려고 시도해서는 안 됩니다.

주문하다:

cat /dev/ttys011 | tee /dev/ttys011

cat캡처된 입력은 원래 위치로 복원되지 않습니다 . 즉, tee원래 읽기에 관심이 있었던 프로세스(예: 쉘)로 전달되지 않고 단지 터미널의 출력으로 전송되어 표시됩니다.

참고: 터미널 이름을 얻기 위해 C 프로그램이나 기능이 필요하지 않습니다 . 쉘 프롬프트에 입력하고 Enter를 누르기 ttyname()만 하면 됩니다 .tty

관련 정보