Uzak bir ana bilgisayara bir soket bağlantısı yapmayı deneyen pthread
ortaya çıkan bazı kodlarım var. Bağlantı hiç kaybolursa, soketinde connect()
numaralı bir engellemeyi kullanarak yeniden bağlanmayı dener. Kod ayrı bir iş parçacığı içinde çalıştığı için, eşzamanlı soket API'sini kullanması gerçekten umrumda değil.Engelleme soketini gerçekleştiren bir iş parçacığı nasıl bağlanır?
Uygulamamın çıkma zamanı gelene kadar. Düzenli bir kapanışın bazı yanlarını gerçekleştirmek istiyorum, bu yüzden iş parçacığı uyanmak için iş parçacığı eşitleme ilkelerini kullanın ve çıkması için sinyal verin, sonra iş parçacığı üzerinde tamamlamak için beklemek için bir pthread_join()
gerçekleştirin. Bu kilitleme komutunu verdiğimde, iş parçacığı bir connect()
aramanın ortasında değilse harika çalışıyor. Bu durumda, bağlantıyı zaman aşımına uğratmak zorundayım, bu da uzun bir zaman olabilir. Bu, uygulamanın kapatılması uzun sürüyor gibi görünüyor.
Yapmak istediklerim, bir şekilde connect()
aramasına aramayı kesmektir. Çağrı geri döndükten sonra, iş parçacığı çıkış sinyalimi fark edecek ve temiz bir şekilde kapanacaktır. connect()
bir sistem çağrısı olduğundan, bir sinyal kullanarak kasıtlı olarak kesebileceğimi düşündüm (bu nedenle EINTR
numaralı çağrıyı geri döndürür), ancak POSIX iş parçacıklarında sağlam bir yöntem olup olmadığından emin değilim.
Sinyalleri veya başka bir yöntem kullanarak, bunun nasıl yapılacağı konusunda herhangi bir önerisi var mı? Bir not olarak, connect()
çağrısı bazı kütüphane kodlarında değiştiremediğim için, engelleme olmayan bir yuvaya geçmek bir seçenek değildir.
Lütfen ayrıca bir dil etiketi koyun. – Tudor
Aslında Python'da yazıyorum, ama dile özgü hiçbir şey aramıyorum. Linux üzerinde çalıştığımı varsayabilirsin. –
Soketi kapatın. –