Evet, linux, temizlemenin anlamlı olduğu ölçüde soyut soketleri otomatik olarak "temizler". İşte bunu doğrulayabileceğiniz minimal bir çalışma örneği:
#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();
}
Bu programı şu şekilde ./a.out /test-socket &
çalıştırın, sonra çalıştırın ss -ax | grep test-socket
ve kullanılan soketi göreceksiniz. Ardından kill %./a.out
, ve ss -ax
soket gitmiş olduğunu gösterecektir.
Bununla birlikte, bu temizlemeyi herhangi bir belgede bulamamanızın nedeni, soyut olmayan unix alan soketlerinin temizlenmesi gerektiği ile aynı anlamda temizlenmemesidir. Soyut olmayan bir soket aslında bir inode tahsis eder ve bir dizinde temel dosya sisteminde temizlenmesi gereken bir girdi oluşturur. Buna karşılık, soyut bir soketi daha çok TCP veya UDP bağlantı noktası numarası gibi düşünün. Elbette, bir TCP bağlantı noktasını bağlarsanız ve sonra çıkarsanız, o TCP bağlantı noktası tekrar boş olacaktır. Ama kullandığınız 16 bitlik sayı ne olursa olsun hala soyut ve her zaman var. Bağlantı noktası numaralarının ad alanı 1-65535'tir ve hiçbir zaman değişmez veya temizlenmesi gerekmez.
Bu nedenle, soyut soket adını bir TCP veya UDP port numarası gibi düşünün, sadece yol adları gibi görünen ancak daha büyük olası port numaraları kümesinden seçildi. Aynı bağlantı noktası numarasını iki kez bağlayamazsınız (engelleme SO_REUSEADDR
veya SO_REUSEPORT
). Ancak soketi kapatmak (açıkça veya dolaylı olarak sonlanarak) bağlantı noktasını serbest bırakır ve temizlenmesi gereken bir şey kalmaz.