클라이언트-서버 GUI 프로그램

클라이언트-서버 GUI 프로그램

출력에서 다음 줄을 설명할 수 있습니까 netstat?

Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags       Type       State         I-Node   Path

unix  2      [ ]         STREAM     CONNECTED     37133819 /tmp/.lxterminal-socket:0-xralf
unix  2      [ ]         STREAM     CONNECTED     37109191 /tmp/.lxterminal-socket:0-xralf

답변1

클라이언트-서버 GUI 프로그램

오늘날의 다른 여러 GUI 프로그램과 마찬가지로 lxterminal2008년부터 사용자당 X별로 단일 프로세스에서 모든 터미널 에뮬레이터 창을 표시하려고 시도되었습니다. 이를 위해 표시된 이름(표시 이름과 사용자 이름 포함)으로 기존 소켓에 연결을 시도합니다.

  • 연결이 성공하면 현재 디렉터리와 인수 벡터를 소켓에 덤프하고 종료됩니다. 열린 파일 설명자를 현재 디렉터리에 직접 전달하기 위해 파일 설명자 전달을 사용하지 않고 이름으로 전달합니다.
  • 연결이 실패하면 시도합니다.그 자체이 소켓에서 청취 서버가 됩니다. 현재 디렉터리 및 인수 벡터가 포함된 메시지를 읽고, 마치 자체 현재 디렉터리 및 인수 벡터인 것처럼 각 읽기에 대해 새 GUI 터미널 에뮬레이션 창을 엽니다.

이것의 명백한 효과는 lxterminal호출한 첫 번째 프로그램(계속 실행)이 동기적으로 실행되는 반면 두 번째 및 후속 프로그램은 그렇지 않다는 것입니다. 이것을 관찰하려면 다음에서 이동하십시오.아니요 lxterminal인스턴스 실행 중, 실행 중다양한 터미널 에뮬레이터, 그리고 전화

lx터미널 및 절전 LX 터미널;
껍질에서. 셸은 1초 후에 프롬프트로 돌아가고 lxterminal아직 실행 중인 작업 1개만 표시합니다.

rxvt에는 유사한 기능이 있지만 서버는 명시적으로 호출되어야 하고 클라이언트는 urxvtd명시적으로 실행되어야 합니다 . urxvtc일반 실행에서는 urxvt클라이언트-서버 헛소리를 시도하지 않습니다.

그놈 터미널오직이에 비해 이 접근 방식은 효과적입니다. 그것언제나인수 벡터를 서버 프로세스에 전달하고 종료합니다. 또한 모든 디스플레이(및 메커니즘이 초기화되고 부팅되는 방식의 오류)를 처리하는 서버 프로세스는 사용자당 하나뿐입니다.

불안정

예측 가능한 이름으로 파일과 소켓을 생성하는 것은 /tmp잘 알려진 보안 문제이므로 lxterminal공유하세요. 사용자는 동일한 시스템에서 다른 사용자가 실행하는 예측 가능한 위치에 소켓을 미리 생성 lxterminal하고 통신을 시도할 수 있습니다.

대신, rxvt는 각 사용자 홈 디렉토리의 그룹 쓰기 불가능, 기타 쓰기 가능 하위 디렉토리를 사용합니다. 이 문제를 해결하는 또 다른 방법은 lxterminal다른 사용자가 소켓을 ./run/user/username/lxterminal

(GNOME 터미널은 사용자 수준 데스크탑 버스를 사용하여 클라이언트와 서버 간 통신을 합니다. 현재 AF_LOCAL소켓 위치는 권한이 없는 다른 사용자가 대체할 수 없습니다.)/run/user/username/

곤충

그놈 터미널을 괴롭히는 문제 중 하나는 에뮬레이트된 터미널의 각 인스턴스에 대해 단일 서버 프로세스에서 많은 수의 열린 파일 설명자를 소비한다는 것입니다. 예전에는 16개였지만 지금은 "단지" 8개로 줄었습니다.

lxterminal2를 사용하세요. 그 중 하나는 클라이언트 프로세스의 소켓 연결에서 누출되는 열린 파일 설명자입니다. 충분한 터미널 에뮬레이션을 켜고 끄면 lxterminal결국 사용 가능한 파일 설명자가 부족해집니다. 다음은 lxterminal실행 중인 인스턴스가 없는 상태에서 시작하여 내 컴퓨터 중 하나에서 서버의 사용 가능한 파일 설명자를 모두 사용하는 데 1분 남짓이 걸렸습니다.

(ulimit -H -n 1024;lxterminal)&
시퀀스 0 1024 |읽을 때 -ri; 실행 lxterminal -e /usr/bin/true;

추가 읽기

관련 정보