출력을 동적으로 리디렉션 - Linux에서는 불가능한 것 같습니다. 이유는 무엇입니까?

출력을 동적으로 리디렉션 - Linux에서는 불가능한 것 같습니다. 이유는 무엇입니까?

웹 검색을 시도했지만 Linux 리디렉션 출력을 동적으로 검색하여 답변을 찾지 못했습니다. 내가 이해한 바로는 출력에 stdout이 파일 설명자 1을 사용하여 작동한다고 나와 있습니다.

$ ls -l /proc/pid/fd/1
lrwx------ 1 user1 user1 64 Sep 27 13:37 1 -> /dev/pts/1

여기에는 파일에 쓸 수 있고 읽을 수 있는 proc파일 시스템과 함께 작동하는 일부 Unix 명령이 있습니다 . 예를 들어 Linux의 경우 사용자가 를 통해 이러한 링크를 수동으로 변경할 수 있는 구현이 없는 이유는 무엇입니까 ? (하려고 하면 오류가 발생합니다 .) 구현하기 어려울까요? 유틸리티 프로그래머는 어떤 유틸리티를 사용해야 할지 어떻게 결정합니까?lsteecatln -sbash"No such file or directory"proc

답변1

Linux와 같은 시스템의 경우 사용자가 bash에서 ln -s를 통해 이러한 링크를 수동으로 변경할 수 있는 이유는 무엇입니까?

proc파일 시스템은 내부 커널 상태만 표시하기 때문입니다 . 어떤 경우에는 특정 파일에 콘텐츠를 작성하여 실제로 커널 상태에 영향을 줄 수 있지만 콘텐츠를 이동할 수 있는 예는 단 하나도 생각나지 않습니다.

구현하기 어려울까요?

커널은 오픈 소스이므로 직접 살펴보고 결정할 수 있습니다("어려움"은 프로그래밍 경험에 따라 다름).

또한 수정 중인 프로세스가 표준 출력에 기록되는 경우 어떤 일이 발생하는지 생각해 보세요. 고려해야 할 보안 관련 사항도 있습니다.

그러나 내 생각에는 업스트림 커널이 그러한 수정을 받을 가능성은 아마도 매우 낮을 것입니다.

유틸리티 프로그래머는 proc에 어떤 유틸리티를 사용해야 하는지 어떻게 결정합니까?

/proc가상 파일 시스템이므로 가상 파일 시스템에 필요한 커널 기능을 구현합니다. 모든 종류의 커널 프로그래머는 일반적으로 커널을 사용할 때 /proc최소한의 노동 집약적인 방식으로 프로그래밍하려고 합니다 .

답변2

Linux에서는 표준 입출력 파일 설명자가 /proc파일 시스템이 아닌 커널 시스템 호출을 통해 생성됩니다.

표시되는 심볼릭 링크 /proc는 데이터를 파이핑하기 위한 실제 수단이 아닙니다.반사프로세스가 데이터에 액세스할 수 있도록 커널이 수행하는 작업입니다. 그렇기 때문에 ln -s변경할 수 없습니다.

출력을 동적으로 리디렉션하는 방법에 대한 질문과 관련하여 이 작업을 수행할 수 있는 명령을 모르겠습니다. 그러나 그것은 확실히 가능합니다. 다음은 그러한 프로그램을 개발하는 방법의 예입니다.

  1. 먼저 구현된 기능부터 시작합니다 cat. 따라서 표준 입력을 받아 표준 출력으로 덤프하십시오. 이는 비대화형 애플리케이션이 됩니다.
  2. 다음으로 프로그램을 대화형으로 변경합니다. 간단한 예는 소량의 입력을 전송하고 사용자가 ENTER 키를 누를 때까지 기다리는 것입니다. 그런 다음 입력을 조금 더 이동하고 반복하십시오. 이 단계에서 프로그램은 일시 중지하고 결정을 내릴 수 있으며, 이는 출력을 동적으로 리디렉션하는 데 중요합니다.
  3. 마지막으로 입력과 출력을 지정하는 명령을 허용하도록 프로그램을 수정합니다. API, NCURSES UI 등을 갖춘 데몬일 수 있습니다.

위의 내용은 물론 말처럼 쉽지 않습니다. 중요한 세부 사항을 많이 얼버무렸지만 이 정도면 최소한 출력을 동적으로 리디렉션하는 것이 가능하다는 점을 보여주기에는 충분하다고 생각합니다.

답변3

stdin 등이 가리키는 위치를 변경하는 대신 하나를 만들 수 있습니다.의사 터미널(PTY)프로그램이 변경된 내용을 알 필요가 없도록 입력과 출력을 이를 통해 리디렉션합니다. 실제로 이를 수행하는 여러 프로그램이 있습니다(종종터미널 멀티플렉서.)

아시다시피, 한 터미널의 세션 연결을 끊고 와 같은 멀티플렉서를 사용하여 다른 곳에서 다시 연결할 수 있지만 tmux항상 표준 입력 또는 출력을 파이프하도록 할 수도 있습니다. 예를 들어, tmux창 내부에서 실행 중인 셸이 있고 명령을 보내는 경우 pipe-pane 'cat >>~/test.txt'(다음에서 가져옴)매뉴얼 페이지) 이제 세션 창 내부에서 아무것도 변경하지 않고 tmux표준 출력을 추가합니다 .~/test.txt

답변4

여기서 핵심적인 오해는 심볼릭 링크가 작성되는 동안 변경하면 예상되는 방식으로 모든 것이 변경된다는 것입니다.

하지 않을 것이다. 실제 파일(또는 장치 또는 파이프)이 열리면 모든 활동은 열린 파일을 기준으로 하며 이를 가리키는 심볼릭 링크와 같은 모든 작업은 무시됩니다. 실제로 이것은 심볼릭 링크에만 국한되지 않고 파일에 이름을 부여하는 "하드" 링크에도 동일하게 적용됩니다. 유닉스 시스템에서는 실제로 파일을 이동하거나 삭제(!)할 수도 있습니다(덮어쓰기 대신!). 뭔가 프로세스가 열려 있고 파일이 닫힐 때까지 프로세스에 변경 사항이 표시되지 않습니다.

관련 정보