Proc stdin 이상한 동작

Proc stdin 이상한 동작

여기에 이미지 설명을 입력하세요.

누군가 이런 일이 발생하는 이유와 stdin으로 전송된 데이터가 stdin에 입력된 데이터와 동일한 방식으로 작동하도록 수정하는 방법을 설명할 수 있습니까?

gif 파일이 안보이시는 분들을 위해

기본적으로 3개의 터미널 설정이 있습니다. 하나는 netcat 서버를 실행하는 것이며, 명령은 다음과 같습니다.

nc -l 127.0.0.1 4000

터미널 2는 netcat 클라이언트만 실행하며 해당 명령은 다음과 같습니다.

nc 127.0.0.1 4000

클라이언트에 입력할 때 이는 기본적으로 프로그램의 stdin 또는 파일 설명자 0에 데이터를 입력하는 것을 의미합니다. Enter 키를 누르면 데이터가 서버에 표시됩니다. 이는 예상된 동작입니다.

키보드 이외의 소스에서 표준 입력에 데이터를 입력하는 경우 끝에 개행 문자나 개행 문자 및 캐리지 리턴을 제공하는 한 동일하게 작동할 것으로 예상할 수 있습니다.

다음 명령으로 터미널 3을 실행하는 경우에는 그렇지 않습니다.

echo "test\n" > /proc/$pid/fd/0

이상하게도 에코의 데이터는 터미널 2에도 나타나지만 키보드 입력으로 처리되지 않으므로 터미널 2의 클라이언트에서 터미널 1의 서버로 메시지가 전송되지 않습니다.

내 결론은 넌센스다.

답변1

링크 를 보면 /proc/$PID/fd/0터미널을 가리키는 것을 볼 수 있습니다.

# ls -l /proc/11962/fd/0
lrwx------ 1 foo users 64 Aug 15 04:30 /proc/11962/fd/0 -> /dev/pts/15

출력하면 프로세스에 입력이 전달되지 않고 nc터미널에 출력됩니다. 출력물이 올바르게 인쇄됩니다.

다음과 같습니다.

   /proc/$PID/fd/$N   <-------> [            ]
                                [  terminal  ]
[  nc  ] <--------------------> [            ]

이건 아니야:

           /proc/$PID/fd/$N  
               |       |
[      ] <-----+       +------> [            ]
[  nc  ] <--------------------> [  terminal  ]

프로세스의 파일 설명자 0이 파일에 열려 있는 경우 쓰기가 /proc/$PID/fd/0프로세스에 대한 입력으로 나타날 것으로 예상합니까, 아니면 열린 파일로 이동합니까?

lrwx------ 1 foo users 64 Aug 15 04:36 /proc/11994/fd/0 -> /tmp/testfile

echo foo > /proc/11994/fd/0이런 상황에서는 어떻게 해야 할까요?

여기도 마찬가지입니다. 프로세스가 fd에서 데이터를 읽을 때 파일에서 데이터를 읽습니다. 하지만 쓰기 위해 동일한 파일을 다시 열면 다음과 같이 /proc/$PID/fd/$N씁니다.도착하다문서.

터미널의 입력 버퍼를 데이터로 채우려면 TIOCSTI ioctl 또는 유사한 메커니즘을 사용해야 합니다. 바라보다tty_ioctl(4)

관련 정보