हां, लिनक्स स्वचालित रूप से "सॉकेट्स" को इस हद तक साफ कर देता है कि सफाई भी समझ में आती है। यहां एक न्यूनतम काम करने का उदाहरण दिया गया है जिसके साथ आप इसे सत्यापित कर सकते हैं:
#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
दिखाएगा कि सॉकेट चला गया है।
हालाँकि, आप किसी भी दस्तावेज़ में इस सफाई को नहीं पा सकते हैं, यह वास्तव में एक ही अर्थ में सफाई नहीं है कि गैर-अमूर्त यूनिक्स-डोमेन सॉकेट्स को सफाई की आवश्यकता है। एक गैर-अमूर्त सॉकेट वास्तव में एक इनकोड आवंटित करता है और एक निर्देशिका में एक प्रविष्टि बनाता है, जिसे अंतर्निहित फ़ाइल सिस्टम में साफ करने की आवश्यकता होती है। इसके विपरीत, एक टीसीपी या यूडीपी पोर्ट नंबर की तरह एक अमूर्त सॉकेट के बारे में सोचें। निश्चित रूप से, यदि आप एक टीसीपी पोर्ट को बांधते हैं और फिर बाहर निकलते हैं, तो वह टीसीपी पोर्ट फिर से मुक्त हो जाएगा। लेकिन जो भी 16-बिट नंबर आपने उपयोग किया वह अभी भी हमेशा मौजूद है और हमेशा किया है। पोर्ट संख्याओं का नाम स्थान 1-65535 है और कभी भी सफाई या परिवर्तन की आवश्यकता नहीं होती है।
तो बस टीसीपी या यूडीपी पोर्ट नंबर जैसे अमूर्त सॉकेट नाम के बारे में सोचें, बस संभव पोर्ट संख्याओं के एक बहुत बड़े सेट से लिया जाता है जो कि पथनाम जैसा दिखता है लेकिन ऐसा नहीं है। आप एक ही पोर्ट नंबर को दो बार बाँध नहीं सकते (बैरिंग SO_REUSEADDR
या SO_REUSEPORT
)। लेकिन सॉकेट को बंद करना (स्पष्ट रूप से या स्पष्ट रूप से समाप्त करके) पोर्ट को मुक्त करता है, जिसमें साफ करने के लिए कुछ भी नहीं बचा है।