Unix 도메인 소켓 삭제를 감지하시겠습니까?

Unix 도메인 소켓 삭제를 감지하시겠습니까?

시작 시 Unix 도메인 소켓을 생성하고 이를 수신하기 시작하는 애플리케이션이 있다고 가정합니다. 그러면 애플리케이션의 모든 후속 인스턴스가 해당 소켓에 연결되고 데이터를 첫 번째 인스턴스에 전달한 다음 종료됩니다(또는 다른 인스턴스가 실행 중인 것으로 감지되면 간단히 종료됩니다).

내가 이해한 바로는 이러한 소켓은 파일 시스템의 파일로 표시됩니다. 임의의 타사 프로그램이나 사용자가 파일을 삭제했다고 가정해 보겠습니다. 이제 후속 프로세스는 첫 번째 인스턴스를 감지/통신할 수 없습니다.
첫 번째 파일이 어떻게든 소켓 파일의 삭제를 감지하고 다시 생성할 수 있습니까?

답변1

삭제된 Unix 소켓 파일은 다시 만들 수 없습니다.

실제로 동일한 경로를 사용하여 다른 소켓 파일을 생성할 수 있지만(소켓 파일 설명자를 동일한 주소에 다시 바인딩하려고 시도하여) 연결을 시도하는 클라이언트는 연결하는 대신 "연결이 차단되었습니다." 거부 메시지가 표시됩니다. 처음 바인딩된 소켓에 연결됩니다.

Unix 소켓은 기본적으로 다음과 같이 바인딩되어 있기 때문입니다.인덱스 노드, 경로 대신. netcat이 Unix 소켓을 지원하는지 쉽게 확인할 수 있습니다.

nc -lU /tmp/old_sock &
[1] 19241
ln -f /tmp/old_sock /tmp/new_sock; rm /tmp/old_sock
     # or mv /tmp/old_sock /tmp/new_sock 
echo yup | nc -U /tmp/new_sock
yup

프로그램이 할 수 있는 일은 기존 소켓을 닫고 다른 소켓을 생성하여 동일한 주소에 바인딩하는 것뿐입니다. 파일 삭제에 대한 알림을 받으려면 inotify(7)Linux, kqueue(2)BSD 에서 사용하거나 stat(2)(다른 파일과 마찬가지로) 주기적으로 경로에서 실행할 수 있습니다.

Linux에는 "추상" Unix 소켓도 있습니다. 이 소켓은 파일 시스템 개체가 아닌 일련의 바이트 [1]에 바인딩되어 있으며 파일 스타일 액세스 권한이 적용되지 않으며 "삭제"하거나 이동할 수 없습니다. 다른 주소로.

[1] 이것을 "문자열"이라고 부를 수 있지만 파일 시스템 경로와 달리 NUL 바이트를 포함할 수도 있습니다.

관련 정보