ใช่ linux "ล้าง" ซ็อกเก็ตนามธรรมโดยอัตโนมัติในระดับที่การทำความสะอาดแม้จะสมเหตุสมผล นี่คือตัวอย่างการทำงานขั้นต่ำที่คุณสามารถยืนยันได้:
#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 โดเมนที่ไม่เป็นนามธรรมต้องล้าง ซ็อกเก็ตที่ไม่เป็นนามธรรมจัดสรรไอโหนดและสร้างรายการในไดเรกทอรีซึ่งจำเป็นต้องล้างข้อมูลในระบบไฟล์พื้นฐาน ในทางตรงกันข้ามลองนึกถึงซ็อกเก็ตที่เป็นนามธรรมมากกว่าหมายเลขพอร์ต TCP หรือ UDP แน่นอนถ้าคุณผูกพอร์ต TCP แล้วออกพอร์ต TCP นั้นจะว่างอีกครั้ง แต่สิ่งที่คุณใช้เลข 16 บิตยังคงมีอยู่นามธรรมและทำเสมอ เนมสเปซของหมายเลขพอร์ตคือ 1-65535 และไม่เคยเปลี่ยนแปลงหรือจำเป็นต้องทำความสะอาด
ดังนั้นลองนึกถึงชื่อซ็อกเก็ตแบบนามธรรมเช่นหมายเลขพอร์ต TCP หรือ UDP เพียงเลือกจากชุดหมายเลขพอร์ตที่เป็นไปได้ที่มีขนาดใหญ่กว่าซึ่งดูเหมือนว่าชื่อพา ธ แต่ไม่ใช่ คุณไม่สามารถผูกหมายเลขพอร์ตเดียวกันได้สองครั้ง (ยกเว้นSO_REUSEADDR
หรือSO_REUSEPORT
) แต่การปิดซ็อกเก็ต (โดยชัดแจ้งหรือโดยปริยายโดยการยกเลิก) ทำให้พอร์ตไม่มีสิ่งใดเหลือให้ทำความสะอาด