그렇다. 리눅스는 정리하는 것이 의미가있는 한 추상 소켓을 자동으로 "정리"한다. 다음은이를 확인할 수있는 최소 작업 예입니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
int
main(int argc, char **argv)
{
int s;
struct sockaddr_un sun;
if (argc != 2 || strlen(argv[1]) + 1 > sizeof(sun.sun_path)) {
fprintf(stderr, "usage: %s abstract-path\n", argv[0]);
exit(1);
}
s = socket(AF_UNIX, SOCK_STREAM, 0);
if (s < 0) {
perror("socket");
exit(1);
}
memset(&sun, 0, sizeof(sun));
sun.sun_family = AF_UNIX;
strcpy(sun.sun_path + 1, argv[1]);
if (bind(s, (struct sockaddr *) &sun, sizeof(sun))) {
perror("bind");
exit(1);
}
pause();
}
이 프로그램을으로 실행 ./a.out /test-socket &
한 다음을 실행 ss -ax | grep test-socket
하면 사용중인 소켓이 표시됩니다. 그런 다음 kill %./a.out
, 및 ss -ax
소켓가 없어 표시됩니다.
그러나 모든 문서 에서이 정리를 찾을 수없는 이유는 비 추상 unix-domain 소켓을 정리 해야하는 것과 같은 의미로 실제로 정리하지 않기 때문입니다. 비추 상 소켓은 실제로 inode를 할당하고 기본 파일 시스템에서 정리해야하는 디렉토리에 항목을 작성합니다. 대조적으로 추상 소켓은 TCP 또는 UDP 포트 번호와 비슷합니다. 물론, TCP 포트를 바인드 한 후 종료하면 해당 TCP 포트가 다시 사용 가능해집니다. 그러나 사용했던 16 비트 숫자는 여전히 추상적이며 항상 존재합니다. 포트 번호의 네임 스페이스는 1-65535이며 변경하거나 정리할 필요가 없습니다.
따라서 추상 소켓 이름을 TCP 또는 UDP 포트 번호와 같이 생각하십시오. 경로 이름처럼 보이지만 그렇지 않은 훨씬 더 많은 가능한 포트 번호 세트에서 선택했습니다. 동일한 포트 번호를 두 번 (바인드 SO_REUSEADDR
또는 SO_REUSEPORT
) 바인딩 할 수 없습니다 . 그러나 소켓을 닫으면 (명시 적으로 또는 암시 적으로 종료하여) 포트를 비울 수 있으며 정리할 항목이 없습니다.