Tôi có một đoạn mã đơn giản để ghi định kỳ dữ liệu vào một fd được truyền cho nó. Các fd rất có thể sẽ là một đường ống hoặc ổ cắm nhưng có khả năng có thể là bất cứ điều gì. Tôi có thể phát hiện khi socket/pipe bị đóng/bị hỏng bất cứ khi nào tôi viết() cho nó, vì tôi gặp lỗi EPIPE (tôi bỏ qua SIGPIPE). Nhưng tôi không viết cho nó mọi lúc, và vì vậy có thể không phát hiện được một ổ cắm kín trong một thời gian dài. Tôi cần phải phản ứng với việc đóng cửa càng sớm càng tốt. Có một phương pháp kiểm tra fd mà không cần phải viết một()? Sau đó tôi có thể làm điều này định kỳ nếu tôi không viết bất cứ điều gì.Linux: Kiểm tra xem ổ cắm/ống có bị hỏng mà không đọc()/write()
Trả lời
struct pollfd pfd = {.fd = yourfd, .events = POLLERR};
if (poll(&pfd, 1, whatever) < 0) abort();
if (pfd.revents & POLLERR) printf("pipe is broken\n");
này làm việc cho tôi. Lưu ý rằng ổ cắm không chính xác ống và do đó cho thấy hành vi khác nhau (-> sử dụng POLLRDHUP).
Aha! Tôi đã có lỗi đánh máy và đang kiểm tra các sự kiện trên đường ra ngoài thay vì bị lộ. Rất cám ơn, điều này đã làm việc rất tốt. – gimmeamilk
Câu trả lời hay. Tôi quá quen với việc chọn() gọi. Tôi chắc chắn phải cố gắng phát triển vào thời điểm đó. +1 –
Hãy thử với lựa chọn và errorfds của tham số:
int **select**(int nfds, fd_set *restrict readfds,
fd_set *restrict writefds, **fd_set *restrict errorfds**,
struct timeval *restrict timeout);
Cảm ơn, nhưng tôi đã thử thêm fd của tôi vào bộ ngoại lệ và không thể làm cho nó hoạt động khác khi ống bị hỏng. (Nó có thể làm việc tốt với ổ cắm; Tôi đã không cố gắng được nêu ra kể từ khi thiết lập hiện tại của tôi mang lại cho tôi một đường ống) – gimmeamilk
Câu trả lời hay, tôi thích chúng ... Tôi cũng cần thoát khỏi habbit chọn và vào (e) bình chọn.
Dưới đây là một số phương pháp truyền thống hơn, nếu bạn cần chúng:
/* check whether a file-descriptor is valid */
int fd_valid(int fd)
{
if (fcntl(fd, F_GETFL) == -1 && errno == EBADF) return FALSE;
return TRUE;
}
một này cố gắng lặp lại trong các ổ cắm/fd. Nó đơn giản hơn rất nhiều so với vẻ bề ngoài, tôi rời rất nhiều debug trong.
/* check a file descriptor */
int fd_check(int i) {
int fd_dup = dup(i);
if (fd_dup == -1) {
strcpy(errst, strerror(errno));
// EBADF oldfd isn’t an open file descriptor, or newfd is out of the allowed range for file descriptors.
// EBUSY (Linux only) This may be returned by dup2() during a race condition with open(2) and dup().
// EINTR The dup2() call was interrupted by a signal; see signal(7).
// EMFILE The process already has the maximum number of file descriptors open and tried to open a new one.
if (errno == EBADF) {
return FALSE;
}
return TRUE;
}
close(fd_dup);
return TRUE;
}
- 1. Kiểm tra xem URL có bị hỏng trong Javascript
- 2. Cách kiểm tra nhanh xem tệp zip có bị hỏng không?
- 3. Kiểm tra xem ổ cắm có bị đóng trong bash không?
- 4. Linux: cách kiểm tra xem ổ đĩa có được gắn kết với nfs
- 5. Mẫu khóa đã kiểm tra đôi: Bị hỏng hay không?
- 6. Kiểm tra xem phím có bị Qt
- 7. Kiểm tra xem ổ cắm có đang nghe trong C
- 8. Kiểm tra RSpec bị hỏng bởi phân trang (Kaminari)
- 9. Làm thế nào để kiểm tra xem ổ đĩa CD được mở hay đóng trong linux?
- 10. JavaScript/jQuery kiểm tra các liên kết bị hỏng
- 11. Cách kiểm tra xem OutputStream có bị đóng không
- 12. C# kiểm tra xem thư mục có bị ẩn không?
- 13. Tại sao khóa kiểm tra kép bị hỏng trong Java?
- 14. kiểm tra xem VT-x có được kích hoạt mà không phải khởi động lại trong Linux không?
- 15. Làm cách nào để kiểm tra xem ổ cắm có được kết nối không?
- 16. Chỉ có đường ống bị hỏng ở lần gửi thứ hai trên ổ cắm kín
- 17. Kiểm tra xem "exec" có bị vô hiệu hóa
- 18. Kiểm tra xem tất cả các thẻ có bị đóng
- 19. SVN kiểm tra linux
- 20. Cách kiểm tra xem JCheckBox có được kiểm tra không?
- 21. Làm thế nào để kiểm tra xem stdin vẫn mở mà không bị chặn?
- 22. Kiểm tra xem ổ cắm có được kết nối hay không
- 23. kiểm tra xem ổ cắm máy chủ có đang mở ở phía bên kia không
- 24. Làm cách nào để kiểm tra xem ổ cắm có được đóng trong Boost.Asio không?
- 25. Là std :: async bị hỏng trong gcc 4.7 trên linux?
- 26. kiểm tra xem biến có trống không
- 27. Kiểm tra xem thiết bị có nằm ngang qua ADB
- 28. C#: Kiểm tra xem tệp có bị khóa và ghi
- 29. Kiểm tra xem cửa sổ có bị mất tiêu điểm
- 30. C, kiểm tra xem tệp có tồn tại mà không có khả năng đọc/ghi không?
chọn, thăm dò, và epoll tất cả sẽ cho bạn biết –
Cảm ơn cho câu trả lời, nhưng tôi không chắc chắn làm thế nào để làm cho công việc này với ống. Tôi đã thử một cuộc gọi select() với fd của tôi trong ghi và ngoại trừ fdsets, và kết quả của cuộc gọi không thay đổi khi đường ống bị hỏng (luôn luôn trả lại fd của tôi trong bộ ghi). Tôi cũng đã thử poll() với tất cả các sự kiện được thiết lập và một lần nữa không có sự khác biệt. – gimmeamilk
Không đẩy fd của bạn vào fdsets viết. Chỉ có một ngoại trừ. –