2010-12-30 33 views
5

Tôi đang gặp phải sự cố khi sử dụng chức năng chọn trong Unix.Có cần phải đặt lại fd_set giữa cuộc gọi hệ thống được chọn không?

Tôi có một máy chủ đang chờ kết nối. Trước tiên, tôi thêm bộ mô tả tệp ổ cắm nghe listener vào fd_set readfds sử dụng FD_SET(listener, readfds) và sau đó tôi sử dụng nó trong select().

Khi tôi nhận kết nối, tôi gọi accept() và đặt readfds khi được chọn với bộ mô tả tệp được chấp nhận và bắt đầu nhận dữ liệu từ kết nối. Tuy nhiên, khi tôi kiểm tra mã trong strace, lựa chọn không hiển thị người nghe trong readfds trong khi select() đang thực hiện lần thứ hai.

Tôi có cần đặt lại bộ mô tả tệp trình nghe bằng cách sử dụng FD_SET(listener, readfds) trước khi gọi lại select() nữa không?

Cảm ơn.

+0

Cũng không phải trên Linux, giá trị thời gian chờ có thể được sửa đổi và do đó cũng cần được khởi tạo lại. Tiêu chuẩn cho phép điều này nhưng không phổ biến trong các hương vị khác của unix. –

Trả lời

10

Có (cần phải đặt lại số fd_set giữa các cuộc gọi hệ thống select()).

Đó là một mối phiền toái, nhưng chúng hoạt động như thông số đầu vào/đầu ra; chúng được đọc và sửa đổi bởi cuộc gọi hệ thống. Khi trả về select(), các giá trị đã được sửa đổi để phản ánh tập hợp các bộ mô tả tệp đã sẵn sàng. Vì vậy, mỗi lần trước khi bạn gọi select(), bạn phải (lại) khởi tạo các giá trị fd_set.

+0

Tôi không nhận được câu trả lời của bạn một cách rõ ràng. Là nó sau khi chọn trả về listenfd (trên đó tôi chấp nhận) được thiết lập lại từ fd_set đọc mà tôi đang tìm kiếm dữ liệu nhận được trong lựa chọn. – sandeep

+0

Cảm ơn Jonathan..Its rõ ràng ngay bây giờ. – sandeep

1

Jonathan là chính xác. Bạn cần phải thực hiện mọi việc sau:

set readFDs 
set writeFDs 
set errorFDs 
select(count_of_FDs, readFDs, writeFDs, errorFDs, timeout) 
Các vấn đề liên quan