2012-02-23 15 views
7

Sổ tay trang getitimer (2) tuyên bố rằngTại sao cả tv_sec và tv_usec lại quan trọng trong việc xác định thời lượng của bộ hẹn giờ?

cả tv_sec và tv_usec quan trọng trong việc xác định thời gian của một timer

Nó không đi vào để nói tại sao đó là. Trong nhiều ví dụ mà tôi đã đi qua tv_sec chỉ đơn giản là thiết lập để 0, trong khi tv_usec được đưa ra một số giá trị hợp lý, hoặc ngược lại. Các bộ tính giờ này có đếm ngược đồng thời hay là tổng thời gian đếm ngược tv_sec + tv_usec? Tôi có nên sử dụng cả hai? Cũng không?

+2

Tôi không tin trang người đàn ông bao gồm "tại sao ..." –

+0

Bạn là một người thông minh! – Ziggy

Trả lời

17

Các man page tài liệu các timeval cấu trúc:

struct timeval { 
    long tv_sec;    /* seconds */ 
    long tv_usec;    /* microseconds */ 
}; 

Nếu bạn muốn đợi toàn bộ số giây, bạn chỉ cần đặt tv_sec. Nếu bạn muốn đợi một phần giây, bạn sẽ đặt tv_usec. Nếu bạn muốn chờ 4,5 giây, bạn sẽ đặt cả hai của chúng cho các giá trị thích hợp (tương ứng là 4 và 500000)

+2

Ngoài ra, usec có được phép vượt quá 1 giây không? – Ziggy

+2

POSIX dường như không chỉ định bất kỳ hành vi nào cho tất cả các trường hợp góc (tv_usec <0, tv_nsec <0, tv_usec> 1000000, tv_nsec> 1000000000), vì vậy tốt nhất là không nên để điều đó xảy ra. –

1

Có, tổng thời gian là tổng của cả hai. tv_sec là giây. Và tv_usec là micro giây hơn thế.

+0

vì vậy ví dụ nếu tôi đã cho họ giá trị 1 và 250000 tương ứng, đó sẽ là 1,25 giây? – Ziggy

+0

Có. Nó sẽ là 1,25 –

3

Cấu trúc được mô tả mặc dù:

struct timeval { 
    long tv_sec;    /* seconds */ 
    long tv_usec;    /* microseconds */ 
}; 

Như bạn thấy, tổng thời gian là tv_sec + (1.0/1000000) * tv_usec giây. Đó là lý do tại sao khi bạn cần thời gian dưới một giây bạn thiết tv_usec, khi bạn cần lần trong 1 giây bạn đặt cả (nhưng thường kết thúc chỉ tv_sec thiết)

+0

Tôi đã chỉnh sửa câu trả lời đã bao gồm 1/1million thay vì –

-1

Tôi đã bị rò rỉ bộ nhớ vì tôi không đặt tv_usec. Comuter mất một tổng của hai giá trị đó và nếu bạn không khởi tạo một trong hai giá trị tổng có thể là ngẫu nhiên.

0

long int tv_usec Đây là phần còn lại của thời gian đã trôi qua (một phần của số giây), được biểu thị bằng số micro giây. Nó luôn ít hơn hơn một triệu.

tv_sec sẽ xử lý toàn bộ giây, trong khi tv_usec xử lý micro giây.

micro giây sẽ đặt lại về 0 khi đạt đến giá trị cực đại (1 triệu) và tăng số giây giống như đồng hồ bấm giờ bình thường.

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