2013-02-11 12 views
7

tôi phải viết một chương trình C trong đó có ngủ cho mili giây, trong đó có để chạy trên các nền tảng khác nhau như Windows, Linux, Solaris, HP-UX, IBM AIX, VxWorks, và WinDriver LinuxNgủ trong mili giây trên Windows, Linux, Solaris, HP-UX, IBM AIX, Vxworks, Wind River Linux?

  • On Windows , cuộc gọi hệ thống Sleep sẽ chỉ hoạt động trên mili giây.
  • Trên Linux, sleep sẽ hoạt động trên giây; usleep sẽ hoạt động trên micro giây và có sẵn trên Solaris.
  • Trong Vxworks, tôi hy vọng tôi có thể triển khai bằng cách sử dụng taskDelaysysClkRateSet.

Làm cách nào để đạt được giấc ngủ một phần nghìn giây này trên HP-UX, IBM AIX và Wind River Linux?

+1

['usleep'] (http://pubs.opengroup.org/onlinepubs/009695399/functions/usleep.html) là POSIX nên có trong tất cả các hệ thống tuân thủ POSIX (như HP/UX, AIX, vv). Tuy nhiên, nó được đánh dấu là lỗi thời, ủng hộ ['nanosleep'] (http://pubs.opengroup.org/onlinepubs/009695399/functions/nanosleep.html) mà mặt khác được đánh dấu là tùy chọn. –

+1

Lưu ý rằng chỉ vì bạn có thể tìm thấy một cách để * express * một sự chậm trễ n-millisecond, hoàn toàn không đảm bảo rằng hệ điều hành máy chủ sẽ * cung cấp cho bạn chính xác những gì bạn yêu cầu. Hệ điều hành: danh sách của bạn thường không phải là thời gian thực, vì vậy họ sẽ rất có thể không đảm bảo những thứ như vậy; khi sự chậm trễ của bạn kết thúc, một nhiệm vụ cao cấp hơn có thể chiếm CPU. – unwind

+0

Liên kết sau có trả lời câu hỏi của bạn không? http://stackoverflow.com/questions/1157209/is-there-an-alternative-sleep-function-in-c-to-milliseconds – kunal18

Trả lời

1

Cân nhắc select với bộ FD trống và thời gian chờ bạn muốn. Từ man select:

Một số mã gọi chọn() với tất cả ba tập hợp rỗng, NFDS zero, và một thời gian chờ không NULL như là một cách khá cầm tay để ngủ với subsecond chính xác.

Thực ra đây có thể là giải pháp tốt nhất cho mọi hệ thống không phải Windows.

+0

Cảm ơn câu trả lời của bạn. hiện tại chúng tôi đang sử dụng điều này chỉ, trong một số nền tảng 'chọn' là không có sẵn. Giống như linux windriver 'select' không có sẵn. – rashok

13

Propably một wrapper sử dụng nền tảng cụ thể #define s sẽ làm:

#if defined(WIN32) 
    #include <windows.h> 
#elif defined(__UNIX__) 
    #include <unistd.h> 
#else 
#endif 

... 

int millisleep(unsigned ms) 
{ 
#if defined(WIN32) 
    SetLastError(0); 
    Sleep(ms); 
    return GetLastError() ?-1 :0; 
#elif defined(LINUX) 
    return usleep(1000 * ms); 
#else 
#error ("no milli sleep available for platform") 
    return -1; 
#endif 
} 

Cập nhật

Đề cập đến Jonathan's comment below, hãy tìm một hiện đại hơn, di động hơn (và cũng khắc phục: }) phiên bản tại đây:

#if defined(WIN32) 
    #include <windows.h> 
#elif defined(__unix__) 
    #include <time.h> 
    #include <unistd.h> 
#else 
#endif 

... 

int millisleep(unsigned ms) 
{ 
#if defined(WIN32) 

    SetLastError(0); 
    Sleep(ms); 
    return GetLastError() ?-1 :0; 

#elif _POSIX_C_SOURCE >= 199309L 

    /* prefer to use nanosleep() */ 

    const struct timespec ts = { 
    ms/1000, /* seconds */ 
    (ms % 1000) * 1000 * 1000 /* nano seconds */ 
    }; 

    return nanosleep(&ts, NULL); 

#elif _BSD_SOURCE || \ 
    (_XOPEN_SOURCE >= 500 || \ 
    _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED) && \ 
    !(_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700) 

    /* else fallback to obsolte usleep() */ 

    return usleep(1000 * ms); 

#else 

# error ("No millisecond sleep available for this platform!") 
    return -1; 

#endif 
} 
+0

đây thực sự là câu trả lời rất tốt Alk –

+0

Theo POSIX 2004, cuộc gọi ['usleep()'] (http://pubs.opengroup.org/onlinepubs/009695399/functions/usleep.html) được đánh dấu là 'đã lỗi thời' và nó đã bị xóa khỏi POSIX 2008. Cách thay thế ưu tiên là ['nanosleep()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/nanosleep.html).Xu hướng chung trong POSIX là thích 'struct timespec', có độ phân giải nano giây, thay vì' struct timeval' chỉ có độ phân giải micro giây hoặc 'usleep()' không sử dụng cấu trúc nhưng hoạt động với độ phân giải micro giây quá. –

+0

@JonathanLeffler: Cảm ơn bạn đã thông báo. Đã sửa. – alk

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