그래픽 터미널에서 실행되는 프로그램을 다른 프로그램으로 바꾸는 방법은 무엇입니까?

그래픽 터미널에서 실행되는 프로그램을 다른 프로그램으로 바꾸는 방법은 무엇입니까?

그래픽 터미널에서 실행되는 ncurses 프로그램이 있고 해당 터미널 외부에서 내가 선택한 다른 프로그램으로 top대체될 명령을 실행하고 싶다고 가정해 보겠습니다.top

이 문제를 해결하는 일반적인 방법이 있다고 생각합니다.

  • 올바른 창의 PTY 찾기
  • PTY를 유지하면서 터미널에서 프로그램 종료
  • 대체 명령을 생성하고
  • PTY I/O를 연결하여 명령 읽기/쓰기

이 문제를 해결하기 위해 기존의 일반 솔루션을 Google에서 검색했지만 유용한 포인터가 생성되지 않았습니다.

이에 대한 구체적인 사용 사례: gnome-terminal에서 실행 중인 tmux 클라이언트를 하나의 /tmp/tmux-$UID/Socket(=서버)에서 창을 "잃지" 않고 동일한 사용자에 속한 다른 클라이언트로 전환하고 싶습니다.

런타임 시 연결된 tmux 클라이언트를 새 소켓에 연결/부착할 수 없기 때문에 일반적인 솔루션을 찾고 있습니다.

답변1

내가 아는 한, 이를 위한 보편적인 해결책은 없습니다. tmux 클라이언트는 gnome-terminal의 개입 없이는 gnome-terminal이 통신하는 pty를 변경하거나 pty가 속한 프로그램(마스터 또는 슬레이브)을 변경할 수 없습니다. 매우 번거로운 코드입니다(예를 들어 원하는 것과 반대되는 작업을 수행하는 reptyr 참조 - pty를 다른 프로그램으로 이동하는 대신 프로그램을 다른 pty로 이동).

특히 tmux의 경우 tmux가 충분히 새로운 경우(2.4 이상) detach-client -E실행 중인 tmux 클라이언트를 다른 프로세스로 바꿀 수 있습니다. 이는 다른 tmux 클라이언트일 수 있습니다. 예를 들면 다음과 같습니다.

tmux -Lfirstsocket detach -E 'tmux -Lsecondsocket attach'

tmux가 충분히 새롭지 않은 경우 옵션은 다음으로 제한될 수 있습니다.

  • 새 tmux 클라이언트를 사용하여 gnome-terminal에서 새 탭을 열고 원래 탭을 닫습니다.

  • gnome 터미널을 완전히 닫고 원하는 프로그램이 포함된 다른 터미널을 엽니다.

  • 이전 tmux에서 새 tmux를 연 다음 상태 표시줄을 숨기고 이전 tmux에서 접두사 설정을 해제하면 계속 실행되지만 방해가 되지 않습니다.

답변2

터미널 에뮬레이터의 문제점은 생성한 실행 파일이 종료될 때 닫힌다는 것입니다. 그러나 터미널 에뮬레이터 내에서 다음과 같은 작은 래퍼를 실행할 수 있습니다.

  1. UNIX 소켓에서 명령을 수신합니다.
  2. 그것을 실행하고,
  3. 새 메시지가 도착하면 명령을 종료합니다.
  4. 1로 이동합니다.

이 같은작은 점. 파일을 디렉터리에 저장하고 다음을 사용하여 서버를 컴파일할 수 있습니다.

gcc -Wall -o server libwrapper.c server.c

고객과:

gcc -Wall -o client libwrapper.c client.c

터미널에서 서버를 실행합니다.

./server

그리고 클라이언트 스위치 명령을 통해 다른 클라이언트에서:

./client /bin/cat /etc/motd

관련 정보