2011-10-03 61 views
19

Tôi đang sử dụng chức năng chọn để liên lạc giữa các ổ cắm của tôi. Tôi có vòng lặp while và tôi làm -Tại sao FD_SET/FD_ZERO cho select() bên trong vòng lặp?

while(!done) { 

    FD_ZERO(&read_flags); 
    FD_ZERO(&write_flags); 
    FD_SET(comm_fd1, &read_flags); 
    FD_SET(comm_fd2, &read_flags); 
    FD_SET(STDIN_FILENO, &read_flags); 
    FD_SET(comm_fd1, &write_flags); 
    FD_SET(comm_fd2, &write_flags); 
    FD_SET(STDIN_FILENO, &write_flags); 

    //call select 
    sel = select(comm_fd1+comm_fd2+1, &read_flags, &write_flags, (fd_set*)0, &waitd); 

và giống với các biến khác nhau ở phía máy khách. Tôi đã có kỹ thuật cơ bản này từ một hướng dẫn trực tuyến và chỉ cần đi với nó. Sau đó, nó đánh tôi - tại sao tôi xóa bộ và thêm các bộ mô tả tập tin mỗi khi tôi lặp lại? Nếu họ đã được thêm vào, tại sao xóa chúng và thêm một lần nữa? Vì vậy, tôi đã cố gắng chỉ làm điều này một lần trước khi trong khi, và mã không hoạt động giống nhau nữa. Ai đó có thể giải thích lý do tại sao? Có phải chỉ vì chọn sửa đổi nội dung của bộ này? Bất kỳ trợ giúp và/hoặc thông tin chi tiết nào đều được đánh giá cao.

Trả lời

21

Khi trả lại số select, bộ này đã cập nhật các bộ để hiển thị các bộ mô tả tệp đã sẵn sàng để đọc/ghi/ngoại lệ. Tất cả các cờ khác đã bị xóa.

Điều quan trọng là bạn bật lại các bộ mô tả tệp đã bị xóa trước khi bắt đầu lựa chọn khác, nếu không, bạn sẽ không còn phải chờ các mô tả tệp đó nữa.

Để bù trừ lại, có thể là thói quen tốt, vì nếu bạn cần thay đổi bộ mô tả tệp (chẳng hạn như thêm ổ cắm mới mở vào bộ đọc), bạn sẽ muốn xóa nó và xây dựng lại nó mỗi lần, để nó chính xác như trạng thái của chương trình thay đổi.

+2

Cũng lưu ý rằng bạn nên đặt lại cấu trúc timeval (đợi trong ví dụ) mỗi khi bạn lặp lại. –

3

Chỉ vì chọn sửa đổi nội dung của bộ này?

Có, sau khi select trả về, chỉ các bộ mô tả sẵn sàng còn lại trong bộ.

Các vấn đề liên quan