2009-07-21 26 views
82

Tôi có một số mã nguồn được biên dịch trên Windows. Tôi đang chuyển đổi nó để chạy trên Red Hat Linux.Có chức năng ngủ thay thế trong C đến mili giây không?

Mã nguồn đã bao gồm tệp tiêu đề <windows.h> và lập trình viên đã sử dụng chức năng Sleep() để đợi khoảng thời gian mili giây. Điều này sẽ không hoạt động trên Linux.

Tuy nhiên, tôi có thể sử dụng hàm sleep(seconds) nhưng sử dụng số nguyên tính bằng giây. Tôi không muốn chuyển đổi mili giây thành giây. Có một chức năng ngủ thay thế mà tôi có thể sử dụng với gcc biên dịch trên Linux?

+0

'ngủ (/ * giây * /) 'trong' ' hoạt động, nhưng nếu tôi sử dụng với 'printf ("một số thứ") 'without' \ n', nó không hoạt động. – EsmaeelE

+0

Để sử dụng trong trường hợp này, chúng ta phải xóa đầu ra bằng 'fflush (stdout);' sau mỗi 'printf()' – EsmaeelE

Trả lời

124

Có - cũ POSIX tiêu chuẩn được xác định usleep(), vì vậy đây là có sẵn trên Linux:

int usleep(useconds_t usec); 

MÔ TẢ

Các usleep() chức năng đình chỉ thực hiện các quá trình gọi điện thoại cho (ít nhất) usec micro giây. Giấc ngủ có thể được kéo dài một chút bởi bất kỳ hoạt động hệ thống nào hoặc theo thời gian xử lý cuộc gọi hoặc bởi chi tiết chi tiết của bộ hẹn giờ hệ thống.

usleep() mất micro, vì vậy bạn sẽ phải nhân đầu vào 1000 để ngủ trong mili giây.


usleep() đã không còn được dùng nữa và sau đó bị xóa khỏi POSIX; cho mã mới, nanosleep() được ưa thích:

#include <time.h> 

    int nanosleep(const struct timespec *req, struct timespec *rem); 

MÔ TẢ

nanosleep() đình chỉ việc thực hiện các đề gọi điện thoại cho đến khi một trong hai ít nhất thời gian quy định trong *req đã trôi qua, hoặc giao hàng của một tín hiệu rằng kích hoạt yêu cầu của trình xử lý trong chuỗi cuộc gọi hoặc kết thúc quá trình.

Cấu trúc timespec được sử dụng để xác định khoảng thời gian với độ chính xác nano giây. Nó được định nghĩa như sau:

 struct timespec { 
      time_t tv_sec;  /* seconds */ 
      long tv_nsec;  /* nanoseconds */ 
     }; 
15

Ngoài usleep, khiêm nhường select với bộ mô tả tập tin NULL sẽ cho phép bạn tạm dừng với độ chính xác micro, và không có nguy cơ bị biến chứng SIGALRM.

sigtimedwait and sigwaitinfo cung cấp hành vi tương tự.

+0

Một mẹo thông minh có khả năng hữu ích ... – mickeyf

13
#include <unistd.h> 

int usleep(useconds_t useconds); //pass in microseconds 
26

Ngoài ra để usleep(), mà không được định nghĩa trong POSIX 2008 (mặc dù nó đã được xác định lên đến POSIX năm 2004, và nó rõ ràng là có sẵn trên Linux và nền tảng khác có tiền sử POSIX tuân thủ), các POSIX tiêu chuẩn 2008 định nghĩa nanosleep():

nanosleep - độ phân giải cao ngủ

#include <time.h> 
int nanosleep(const struct timespec *rqtp, struct timespec *rmtp); 

chức năng nanosleep() sẽ gây Curren t chuỗi bị đình chỉ thực thi cho đến khi khoảng thời gian được chỉ định bởi đối số rqtp đã trôi qua hoặc tín hiệu được gửi tới chuỗi cuộc gọi và hành động của nó là gọi hàm bắt tín hiệu hoặc chấm dứt quá trình. Thời gian đình chỉ có thể dài hơn yêu cầu vì giá trị đối số được làm tròn thành bội số nguyên của độ phân giải giấc ngủ hoặc do lập lịch hoạt động khác của hệ thống. Tuy nhiên, ngoại trừ trường hợp bị gián đoạn bởi tín hiệu, thời gian treo không được nhỏ hơn thời gian được chỉ định bởi rqtp, được đo bằng đồng hồ hệ thống CLOCK_REALTIME.

Việc sử dụng chức năng nanosleep() không ảnh hưởng đến hoạt động hoặc tắc nghẽn của bất kỳ tín hiệu nào.

28

Bạn có thể sử dụng chức năng này cross-platform:

#ifdef WIN32 
#include <windows.h> 
#elif _POSIX_C_SOURCE >= 199309L 
#include <time.h> // for nanosleep 
#else 
#include <unistd.h> // for usleep 
#endif 

void sleep_ms(int milliseconds) // cross-platform sleep function 
{ 
#ifdef WIN32 
    Sleep(milliseconds); 
#elif _POSIX_C_SOURCE >= 199309L 
    struct timespec ts; 
    ts.tv_sec = milliseconds/1000; 
    ts.tv_nsec = (milliseconds % 1000) * 1000000; 
    nanosleep(&ts, NULL); 
#else 
    usleep(milliseconds * 1000); 
#endif 
} 
+1

Khi chúng ta không có '_POSIX_C_SOURCE> = 199309L', như trong trường hợp '-ansi' hoặc' -std = c89', tôi khuyên bạn nên sử dụng 'struct timeval tv; tv.tv_sec = mili giây/1000; tv.tv_usec = mili giây% 1000 * 1000; chọn (0, NULL, NULL, NULL, &tv); 'thay vì' usleep (mili giây * 1000); '. Tín dụng đi [ở đây] (http://stackoverflow.com/a/264378/5472899). –

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