Cách tốt nhất để ngăn chặn sự cố ở đây là gì?
Hoặc vô hiệu hóa sigpipes theo mọi người, hoặc bắt và bỏ qua lỗi.
Có cách nào để kiểm tra xem phía bên kia của dòng vẫn đang đọc không?
Có, sử dụng select ().
select () dường như không hoạt động ở đây vì nó luôn nói rằng socket có thể ghi được.
Bạn cần chọn trên các bit đọc . Bạn có thể bỏ qua các bit ghi .
Khi đầu xa đóng xử lý tệp của nó, chọn sẽ cho bạn biết rằng có dữ liệu sẵn sàng để đọc. Khi bạn đọc và đọc nó, bạn sẽ nhận lại 0 byte, đó là cách HĐH cho bạn biết rằng phần xử lý tệp đã bị đóng.
Lần duy nhất bạn không thể bỏ qua các bit ghi là nếu bạn đang gửi khối lượng lớn và có nguy cơ đầu bên kia bị tồn đọng, điều này có thể khiến bộ đệm của bạn bị đầy. Nếu điều đó xảy ra, thì việc cố gắng ghi vào xử lý tệp có thể khiến chương trình / luồng của bạn bị chặn hoặc không thành công. Kiểm tra chọn trước khi viết sẽ bảo vệ bạn khỏi điều đó, nhưng không đảm bảo rằng đầu kia khỏe mạnh hoặc dữ liệu của bạn sẽ đến.
Lưu ý rằng bạn có thể nhận được một sigpipe từ close (), cũng như khi bạn viết.
Đóng tuôn ra bất kỳ dữ liệu đệm. Nếu đầu kia đã bị đóng, thì đóng sẽ thất bại và bạn sẽ nhận được một sigpipe.
Nếu bạn đang sử dụng TCPIP được đệm, thì việc ghi thành công chỉ có nghĩa là dữ liệu của bạn đã được xếp hàng để gửi, điều đó không có nghĩa là nó đã được gửi. Cho đến khi bạn gọi thành công, bạn không biết rằng dữ liệu của mình đã được gửi.
Sigpipe nói với bạn điều gì đó đã sai, nó không cho bạn biết điều gì hoặc bạn nên làm gì với nó.