Unix alan adı soketinin silinmesini algıla?


1

Başlangıçta bir unix alan soketi oluşturan ve onu dinlemeye başlayan bir uygulamanız olduğunu varsayalım. Daha sonra uygulamanın daha sonraki herhangi bir örneği bu sokete bağlanır, verileri 1. örneğe iletir ve çıkar (veya başka bir örnek çalıştığını tespit ederse çıkar).

Anladığım kadarıyla, bu tür bir soket dosya sistemindeki bir dosya olarak temsil edilir. Bu dosyanın rastgele bir 3. parti program veya kullanıcı tarafından silindiğini varsayalım. Şimdi takip eden işlemler, ilk örnekle tespit edemez / iletişim kuramaz.
İlki bir şekilde soket dosyasının silinmesini algılayabilir ve ardından yeniden oluşturabilir mi?

Yanıtlar:


2

Silinen bir Unix soket dosyasını tekrar oluşturamazsınız.

Aslında, aynı yolla başka bir soket dosyası oluşturabilirsiniz (soket dosya tanımlayıcısını aynı adrese tekrar bağlamaya çalışarak), ancak bağlanmaya çalışan herhangi bir istemci bağlanmak yerine "Bağlantı reddedildi" alır. ilk etapta kendisine bağlı olan soket.

Bunun nedeni, Unix soketlerinin temel olarak yollara değil, düğümlere bağlı olmasıdır . Netcat'ınızın Unix soketlerini destekleyip desteklemediğini kolayca kontrol edebilirsiniz:

nc -lU /tmp/old_sock &
[1] 19241
ln -f /tmp/old_sock /tmp/new_sock; rm /tmp/old_sock
     # or mv /tmp/old_sock /tmp/new_sock 
echo yup | nc -U /tmp/new_sock
yup

Programınızın yapabileceği tek şey eski soketi kapatmak, başka bir tane oluşturmak ve aynı adrese bağlamak. Bir dosyanın kaldırılmasından haberdar olmak için inotify(7)Linux'ta, kqueue(2)BSD'de veya stat(2)düzenli olarak yolda (başka bir dosyadaki gibi) periyodik olarak kullanabilirsiniz.

Linux'un ayrıca "soyut" Unix soketlerine - herhangi bir dosya sistemi nesnesi yerine bir bayt dizisine [1] bağlı olan ve herhangi bir dosya stili erişim hakkına tabi olmayan ve "kaldırılamayan" soketlere sahip olduğuna dikkat edin. veya farklı bir adrese taşındı.

[1] ona "string" diyebilir, ancak dosya sistemi yolundan farklı olarak NUL bayt içerebileceğine dikkat edin.


Of soketi aynı yolla yeniden yaratmayı kastediyordum. Müşteriler, aynı yola sahip olduklarından, yeniden yaratıldıktan sonra görecekler, değil mi? (istemcilerin soketin yeniden oluşturulmasından sonra çalıştırıldığı varsayılarak)
user10260481

Soket dosyası oluşturmanın tek yolu AF_UNIX soket dosya tanımlayıcısını bağlamak () yapmaktır ve bunu yalnızca bir defa yapabilirsiniz. Birisi soket dosyanızı silerse, eski soketi kapatmanız ve soket / ciltleme / dinleme / kabul etme döngüsünün tamamını yeniden yapmanız gerekir. Birisi /tmp/.X11-unix/X0dosyayı kaldırırsa, X11 sunucusunu öldürüp yeniden başlatmanız gerekir, yalnızca farklı bir inode ile yeniden oluşturamazsınız ve X11 sunucusunun onu dinlemesini beklersiniz. Lütfen tüm cevabımı tekrar okuyun, nedenini açıkladım.
Billy Amca

Bunu Linux'ta test edecekseniz, yeni X11 sunucularının ve uygulamalarının tercih edilen soyut soketler kullandığını , bunun nedeni , dosya tabanlı soketler yapabildiği gibi farklı bir adrese taşınamadıklarını unutmayın.
Billy Amca

Sadece, bir kez silme tespit edildiğinde, dinleyicinin mevcut soketi yok edeceği ve aynı adı kullanarak yeni bir tane yaratacağı anlamına geliyordum. Bu, dosyayı diskte yeniden oluşturur ve yeni örnekler onu bulabilir ve dinleyiciyle iletişim kurabilir.
user10260481

Bu, başka hiçbir dosyadan farklı değildir ve açıkçası, bu durumda sorunuzun noktasını göremiyorum: 3. parti soketini çıkarmak yerine sunucunuzu öldürebilir (eğer ikincisi yapabilirse, eski). 4. paragraftan inotify / kqueue / fstat'ın nasıl kullanılacağına dair bir örnek istiyorsanız ve herhangi bir örneği bulamıyorsanız, lütfen stackoverflow ile ilgili bir soru sorun.
Billy Amca
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.