大佬教程收集整理的这篇文章主要介绍了nanosleep不适用于不到一秒的值,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
为了使事情变得更加混乱,使用适当的值(即995000 useC)睡眠时间仅为预期的一秒钟.
我在RHel 5.8和RHel 6.4框中看到了这个问题.两者都在使用gcc.
void msleep(int *milliseconds) { long usec; struct timespec sleep; usec = (*milliseconds) % 1000; sleep.tv_sec = (*milliseconds) / 1000; sleep.tv_nsec = 1000*usec; nanosleep(&sleep,null); }
显然,我实际上并不需要纳秒精度!
试试这个:
#define _POSIX_C_sourcE 199309L /* shall be >= 199309L */ #include <time.h> void msleep(int *milliseconds) { int ms_remaining = (*milliseconds) % 1000; long usec = ms_remaining * 1000; struct timespec ts_sleep; ts_sleep.tv_sec = (*milliseconds) / 1000; ts_sleep.tv_nsec = 1000*usec; nanosleep(&ts_sleep,null); }
更紧凑:
#define _POSIX_C_sourcE 199309L /* shall be >= 199309L */ #include <time.h> void msleep(int * pmilliseconds) { struct timespec ts_sleep = { *pmilliseconds / 1000,(*pmilliseconds % 1000) * 1000000L }; nanosleep(&ts_sleep,null); }
最后一个完整的实现包括错误处理和nanosleep()早期中断的情况:
#define _POSIX_C_sourcE 199309L #include <time.h> #include <errno.h> #include <stdio.h> int ms_sleep(unsigned int ms) { int result = 0; { struct timespec ts_remaining = { ms / 1000,(ms % 1000) * 1000000L }; do { struct timespec ts_sleep = ts_remaining; result = nanosleep(&ts_sleep,&ts_remaining); } while ((EINTR == errno) && (-1 == result)); } if (-1 == result) { perror("nanosleep() Failed"); } return result; }
遵循包装器以满足OP的要求:
#include <errno.h> #include <stdio.h> int ms_sleep(unsigned int); void msleep(int * pms) { int result = 0; if ((NULL == pms) || (0 > *pms)) /* check for valid input. */ { errno = EINVAL; result = -1; } else { result = ms_sleep(*pms)); } if (-1 == result) { perror("ms_sleep() Failed"); /* Exit and/or log error here. */ } }
假设至少C99,这部分上面的代码
struct timespec ts_sleep = { *pmilliseconds / 1000,(*pmilliseconds % 1000) * 1000000L };
可能最好像这样写
struct timespec ts_sleep = { .tv_sec = *pmilliseconds / 1000,.tv_nsec = (*pmilliseconds % 1000) * 1000000L };
不依赖于struct timespec成员的顺序.
以上是大佬教程为你收集整理的nanosleep不适用于不到一秒的值全部内容,希望文章能够帮你解决nanosleep不适用于不到一秒的值所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。