2010-02-24 38 views
9

select() là một cuộc gọi hệ thống tuyệt vời. Bạn có thể đóng gói bất kỳ số lượng mô tả tập tin, mô tả ổ cắm, đường ống, vv và nhận được thông báo trong một thời trang đồng bộ khi đầu vào trở nên có sẵn.select() - bộ hẹn giờ có thể

Có cách nào để tạo bộ hẹn giờ khoảng thời gian/oneshot và sử dụng nó với select() không? Điều đó sẽ giúp tôi tiết kiệm từ việc có nhiều luồng cho IO và thời gian.

+1

Bạn có thể làm rõ những gì loại timer bạn muốn? 'select()' có tham số timeout chuẩn. – qrdl

+0

Thông số hẹn giờ được sử dụng nội bộ bằng select(). Nếu select() đã không nhận được bất kỳ chờ đọc/ghi/err trước thời gian chờ đó, sau đó nó sẽ trở lại. Những gì tôi đang tìm kiếm là một lệnh để biến một bộ đếm thời gian thành một bản ghi và đóng gói nó vào fd_set. –

+0

Thông số timeout chọn chỉ dành cho timeout nếu không có sự kiện nào khác, có khá nhiều công việc để tạo vài bộ hẹn giờ và bộ hẹn giờ trên đầu trang – nos

Trả lời

12

timerfd_create thực hiện chính xác điều này. Đó là một bổ sung khá gần đây cho hạt nhân Linux và có thể không có sẵn trên tất cả các distro được nêu ra.

+0

Wow .. Làm thế nào tôi không biết về điều này? Tôi phải chải lên trên syscalls linux của tôi. –

+2

Đây cũng là một cuộc gọi báo hiệu, trong trường hợp bạn muốn các tín hiệu được phân phối dưới dạng các sự kiện fd :-) – nos

7

Sử dụng tham số thời gian chờ - giữ sự kiện bộ đếm thời gian trong hàng đợi ưu tiên, kiểm tra mục trên cùng và đặt thời gian chờ phù hợp - nếu hết thời gian chờ, bạn có thể kiểm tra xem sự kiện đã sẵn sàng chưa, chạy sự kiện và tiếp tục.

Ít nhất đó là những gì tôi làm.

Lưu ý rằng cuộc thăm dò có giao diện đẹp hơn (theo một số cách) và có thể hiệu quả hơn với nhiều bộ mô tả tệp.

+0

+1 đây là giải pháp di động. –

+0

+1 cảm ơn Mark. Bạn có bất kỳ con trỏ để mẫu mã hoặc FOSS bằng cách sử dụng lừa mà bạn đề nghị? – Viet

2

MarkR có một giải pháp di động đẹp, nhưng đây là một:

Sử dụng một bộ đếm thời gian POSIX (timer_create) và bạn có thể chuyển đổi các vấn đề thành "select tín hiệu -able". Vấn đề này có một giải pháp cổ điển: viết vào một đường ống từ bộ xử lý tín hiệu và select ing trên đầu đọc của ống.

+1

Chà, đây chính xác là những gì tôi đang tìm kiếm. Cảm ơn! :) – troglobit

0

Xây dựng trên @MarkR, sử dụng cấu trúc được sắp xếp để lưu trữ gọi lại + đóng bằng int và con trỏ tới int. Nếu hai int có cùng giá trị thì sự kiện sẽ hoạt động nếu không nó sẽ bị loại bỏ.

Sự kiện theo cách này có thể bị loại bỏ đơn giản bằng cách tăng int. Có lẽ không phải là giải pháp đơn giản nhất nhưng đó là tất cả những gì tôi có thể nghĩ đến.

https://github.com/cheako/tor2web/tree/6ac67f80daaea01d14a5d07e6026e1af4258dc96/src

hextree.c contains the code for the data structure used. 
schedule.c:156 is where the int is changed. 
gnutls.c:197 is where the timers are created. 
Các vấn đề liên quan