Luôn luôn để lại quyết định về cách xử lý EINTR
cho người dùng và giúp dễ dàng tiếp tục hoạt động khi thích hợp.
Thông thường cách tốt nhất để làm điều đó là trả lại từ chức năng thư viện của bạn cho người gọi EINTR
, nhưng trong một số trường hợp, một cuộc gọi lại hoặc một số triển khai khác có thể tốt hơn - cách nào tốt nhất phụ thuộc vào các yếu tố khác, nhưng luôn để người dùng kiểm soát thử lại và sơ yếu lý lịch.
Điều này có nghĩa là nếu mã thư viện của bạn có thể thành công một phần trước khi nhận được EINTR
, thì bạn nên suy nghĩ cẩn thận những gì người dùng có thể cần biết về thành công một phần đó hoặc nếu người dùng có thể cần tiếp tục hoạt động từ nơi thất bại. Bạn có thể cần phải trả lại thông tin bổ sung hoặc cung cấp giao diện để tiếp tục từ bất kỳ nơi nào có thể phù hợp.
Đây là lý do tại sao các cuộc gọi hệ thống như thế read
và write
ngày nay trả lại thành công một phần - bởi vì nó rất bực bội khi người dùng được thông báo:
Bạn đã cố gắng viết "foo"
và chúng tôi đã viết thành công hoặc không có gì, hoặc "f"
, hoặc "fo"
, bạn không biết điều gì . Chúc vui vẻ! Hy vọng hệ thống của bạn có thể xử lý khởi động lại toàn bộ ghi sau bất kỳ trong số đó!
Tất nhiên, trong một số trường hợp, chúng ta nên viết các hệ thống để xử lý các tình huống chính xác như vậy - ví dụ, có lẽ sau khi ghi một phần, bạn luôn tạo lại tệp hoặc mở lại kết nối mạng hoặc bạn sử dụng một số byte để có nghĩa là "bắt đầu lại" - vì vậy nó phụ thuộc vào trường hợp sử dụng thư viện của bạn nhắm mục tiêu.
Nếu một chức năng thư viện thực hiện một số hoạt động và không có cách nào để biết được chúng đã thất bại ở đâu và các hoạt động đó không phải là tất cả một cách an toàn và hiệu quả, điều đó về cơ bản làm cho một thư viện không thể sử dụng được mã cần mạnh mẽ.
Nếu tất cả các bước trong chức năng thư viện là idempotent an toàn và hiệu quả, hoặc toàn bộ là nguyên tử - như có được một khóa - thì chỉ cần cho người dùng biết rằng một sự EINTR
kiện đã xảy ra là đủ.
Ngoài ra, nếu chúng ta thử lại EINTR
, thì chúng ta có thể ngắt xử lý tín hiệu . Ở mức thấp, trình xử lý tín hiệu chỉ có thể sử dụng một cách an toàn một bộ tính năng hạn chế và do đó, trong nhiều trường hợp, trình xử lý tín hiệu sẽ chỉ đặt boolean cho biết tín hiệu đã được nhận, sau đó quay lại, hy vọng rằng khi mã được nối lại, nó sẽ thoát ra khỏi bất cứ điều gì nó đang làm. Nếu chúng tôi nhận được EINTR
và sau đó chúng tôi thử lại thay vì trả lại quyền kiểm soát cho người dùng, chúng tôi có thể sẽ giữ mã không làm điều đó.
Phải làm gì sau EINTR
là một quyết định toàn bộ chương trình - câu trả lời đúng không thể được biết đến mà không biết những gì chương trình đang làm và làm thế nào chương trình có nghĩa là để đáp ứng với một tín hiệu, và nó có ảnh hưởng đến phần còn lại của chương trình.
Biết làm thế nào hoặc nếu người dùng có thể cần tiếp tục và giúp người dùng làm như vậy nếu cần, là trách nhiệm của thư viện - không thể biết câu trả lời đúng mà không biết thư viện đang làm gì.
EINTR
và báo cáo điều đó cho người gọi), nhưng nó có thể phụ thuộc vào thư viện của bạn đang làm gì ...