Pada sistem Unix nama jalur biasanya hampir tidak memiliki batasan panjang (well, 4096 karakter di Linux) ... kecuali untuk jalur file socket yang dibatasi hingga sekitar 100 karakter (107 karakter di Linux ).
- Pertanyaan pertama: mengapa pembatasan yang begitu rendah?
Saya telah memeriksa bahwa tampaknya mungkin untuk mengatasi keterbatasan ini dengan mengubah direktori kerja saat ini dan membuat di berbagai direktori beberapa file soket semua menggunakan jalur yang sama ./myfile.sock
: aplikasi klien tampaknya terhubung dengan benar ke proses server yang diharapkan meskipun lsof
menunjukkan semua dari mereka mendengarkan di jalur file socket yang sama.
- Apakah solusi ini dapat diandalkan atau apakah saya hanya beruntung?
- Apakah perilaku ini khusus untuk Linux atau dapatkah solusi ini berlaku untuk Unix lain juga?
filenames
socket
limit
unix-sockets
WhiteWinterWolf
sumber
sumber
Jawaban:
Kompatibilitas dengan platform lain, atau kompatibilitas dengan hal-hal lama untuk menghindari overruns saat menggunakan
snprintf()
danstrncpy()
.Michael Kerrisk menjelaskan dalam bukunya di halaman 1165 - Bab 57, Sockets: Unix domain:
Orang-orang Docker bahkan menertawakannya, karena beberapa soket panjangnya 110 karakter:
Inilah sebabnya mengapa LINUX menggunakan soket 108 char. Bisakah ini diubah? Tentu saja. Dan ini, adalah alasan mengapa pembatasan ini dibuat pada Sistem Operasi yang lebih lama:
Mengutip jawabannya:
OS lain (unix domain sockets):
sumber
./my.socket
direktori di bawah iniA/
, dan file soket lainnya juga bernama di./my.socket
bawah direktoriB/
)?lsof
tidak membuat perbedaan antara dua file socket, namun sepertinya masih berfungsi tetapi saya bertanya-tanya apakah ini hanya karena saya beruntung. Ini akan menjadi solusi yang baik untuk membuat file socket di bawah jalur yang sudah lebih panjang dari ukuran yang diizinkan.lsof -U| grep amavis
(baris baru)amavis-se 2708 zimbra 17u unix 0xffff8806c0a95400 0t0 310330411 /opt/zimbra/data/tmp/amavisd-zmq.sock
/tmp
dengan berton-ton direktori undeleted unik yang masing-masing berisi file soket tunggal (benar-benar jelek, tetapi portabel dan aman).Mengenai alasannya, nwildner sudah menulis jawaban yang bagus .
Di sini saya hanya akan fokus pada bagaimana dan penggunaan jalur relatif.
Secara internal, sementara file socket juga dapat dicari berdasarkan nama (saya kira), mereka biasanya dicari oleh inode. Di Linux, pencarian ini dijamin oleh fungsi yang
unix_find_socket_byinode()
didefinisikan dalam net / unix / af_unix.c .Ini dapat dengan mudah diperiksa sebagai berikut:
socat
Anda akan menggunakan perintah seperti:Saya memeriksa perilaku ini pada beberapa sistem Unix (Linux Debian, FreeBSD dan OpenIndiana untuk mendapatkan keragaman), jadi perilaku ini setidaknya menyebar luas, jika tidak standar.
Path absolut biasanya digunakan sebagai konvensi antara klien dan proses server, karena proses klien mungkin tidak tahu bagaimana membangun komunikasi awal dengan server.
Namun, jika komunikasi awal ini tidak menjadi masalah, maka dari itu tampaknya aman untuk menggunakan jalur relatif untuk pembuatan file socket, memungkinkan untuk menghindari masalah panjang jalur ketika lokasi file soket tidak secara langsung dikendalikan oleh proses server.
sumber