Có, linux tự động "dọn dẹp" các ổ cắm trừu tượng đến mức làm sạch thậm chí có ý nghĩa. Đây là một ví dụ hoạt động tối thiểu mà bạn có thể xác minh điều này:
#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();
}
Chạy chương trình này dưới dạng ./a.out /test-socket &
, sau đó chạy ss -ax | grep test-socket
và bạn sẽ thấy ổ cắm đang sử dụng. Sau đó kill %./a.out
, và ss -ax
sẽ hiển thị các ổ cắm đã biến mất.
Tuy nhiên, lý do bạn không thể tìm thấy sự dọn dẹp này trong bất kỳ tài liệu nào là vì nó không thực sự dọn dẹp theo cùng một nghĩa là các ổ cắm không tên miền không trừu tượng cần phải dọn sạch. Một ổ cắm không trừu tượng thực sự phân bổ một nút và tạo một mục trong một thư mục, cần được dọn sạch trong hệ thống tệp bên dưới. Ngược lại, hãy nghĩ về một ổ cắm trừu tượng giống như số cổng TCP hoặc UDP. Chắc chắn, nếu bạn liên kết một cổng TCP và sau đó thoát, cổng TCP đó sẽ lại miễn phí. Nhưng bất cứ số 16 bit nào bạn sử dụng vẫn tồn tại một cách trừu tượng và luôn luôn như vậy. Không gian tên của số cổng là 1-65535 và không bao giờ thay đổi hoặc cần làm sạch.
Vì vậy, chỉ cần nghĩ về tên ổ cắm trừu tượng như số cổng TCP hoặc UDP, chỉ cần chọn từ một tập hợp số cổng lớn hơn nhiều có thể trông giống như tên đường dẫn nhưng không phải. Bạn không thể liên kết cùng một số cổng hai lần (chặn SO_REUSEADDR
hoặc SO_REUSEPORT
). Nhưng việc đóng ổ cắm (rõ ràng hoặc ngầm định bằng cách chấm dứt) sẽ giải phóng cổng, không còn gì để dọn dẹp.