Tôi cần chương trình của mình được viết bằng chữ C thuần túy để dừng thực thi khi stdin bị đóng.Làm thế nào để kiểm tra xem stdin vẫn mở mà không bị chặn?
Có công việc không xác định được thực hiện trong chu trình chính của chương trình và không có cách nào tôi có thể sử dụng kiểm tra chặn (như getc()
) ở đó (không có dữ liệu nào đến trên stdin - nó vẫn mở trong thời gian không xác định).
Tôi dự định sử dụng chức năng được mô tả trong việc thực hiện mạng daemon được lưu trữ trong inetd, xinetd hoặc các tương tự của chúng - nó sẽ phát ra dữ liệu trên thiết bị xuất chuẩn trong khi kết nối vẫn mở và hoàn thành công việc khi đóng. Bây giờ chương trình của tôi bị giết bởi dịch vụ lưu trữ vì nó sẽ không dừng lại sau khi chấm dứt kết nối.
Tôi tự hỏi nếu fctntl()
với cờ O_NONBLOCK
áp dụng cho bộ mô tả stdin sẽ cho phép tôi sử dụng chức năng read()
ở chế độ không chặn không? Tôi có nên sử dụng select()
bằng cách nào đó không?
P.S. Dữ liệu không được cho là nhưng có thể đến stdin. Một cách đọc không chặn sẽ là câu trả lời cho câu hỏi.
'poll' cũng chính xác là những gì OP muốn, và giao diện của nó dễ dàng hơn một chút so với' select' khi giao dịch với một bộ mô tả tập tin nhỏ, cố định. – ephemient