Tôi có một số mã sinh ra một số pthread
cố gắng duy trì kết nối ổ cắm với máy chủ từ xa. Nếu kết nối bị mất, nó sẽ cố gắng kết nối lại bằng cách sử dụng lệnh chặn connect()
trên ổ cắm của nó. Vì mã chạy trong một luồng riêng biệt, tôi không thực sự quan tâm đến việc nó sử dụng API socket đồng bộ.Làm thế nào để ngắt một luồng thực hiện một ổ cắm chặn kết nối?
Tức là, cho đến khi ứng dụng của tôi xuất hiện. Tôi muốn thực hiện một số semblance của một shutdown trật tự, vì vậy tôi sử dụng nguyên gốc đồng bộ hóa thread để đánh thức các chủ đề và tín hiệu cho nó để thoát, sau đó thực hiện một pthread_join()
trên thread để chờ đợi cho nó để hoàn thành. Điều này làm việc tuyệt vời, trừ khi thread đang ở giữa một cuộc gọi connect()
khi tôi lệnh tắt máy. Trong trường hợp đó, tôi phải chờ kết nối hết thời gian, có thể là một thời gian dài. Điều này làm cho ứng dụng xuất hiện mất nhiều thời gian để tắt.
Điều tôi muốn làm là làm gián đoạn cuộc gọi đến connect()
theo một cách nào đó. Sau khi cuộc gọi trả về, luồng sẽ nhận thấy tín hiệu thoát của tôi và tắt hoàn toàn. Vì connect()
là một cuộc gọi hệ thống, tôi nghĩ rằng tôi có thể cố ý làm gián đoạn nó bằng tín hiệu (do đó thực hiện cuộc gọi trở lại EINTR
), nhưng tôi không chắc đây có phải là phương pháp mạnh mẽ trong môi trường chủ đề POSIX hay không.
Có ai có bất kỳ đề xuất nào về cách thực hiện việc này, sử dụng tín hiệu hoặc thông qua một số phương pháp khác không? Lưu ý rằng cuộc gọi connect()
bị gỡ xuống trong một số mã thư viện mà tôi không thể sửa đổi, do đó việc thay đổi sang ổ cắm không chặn không phải là một tùy chọn.
Cũng vui lòng đặt thẻ ngôn ngữ. – Tudor
Tôi thực sự viết bằng Python, nhưng tôi không tìm kiếm bất kỳ ngôn ngữ cụ thể nào. Bạn có thể giả định rằng tôi đang hoạt động trên Linux. –
Đóng ổ cắm. –