问题描述
编写代码用于实现程序的休眠,例如,如果要求程序休眠10秒钟,那么在这10秒内程序要一直等待,而不执行任何操作。
解决思路
在Linux下,有一个select函数用于实现进程的阻塞,该函数的原型是:
int select(int n, fd_set *readfds,fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
可以用该函数来实现程序的休眠。
C代码实现
/********************************************************************** * 版权所有 (C)2015, Zhou Zhaoxiong。 * * 文件名称:Sleep.c * 文件标识:无 * 内容摘要:演示休眠程序的编写及调用 * 其它说明:无 * 当前版本:V1.0 * 作 者:Zhou Zhaoxiong * 完成日期:20150430 * **********************************************************************/ #include #include #include #include // 重定义数据类型 typedef unsigned char UINT8; typedef unsigned short int UINT16; typedef unsigned int UINT32; typedef signed int INT32; typedef long int LONG; // 结构体定义 typedef struct { UINT8 second; /* 0-59 */ UINT8 minute; /* 0-59 */ UINT8 hour; /* 0-23 */ UINT8 day; /* 1-31 */ UINT8 month; /* 1-12 */ UINT16 year; /* 1994-2099 */ UINT8 week; /* 1-7 */ UINT8 Count10ms; /* 0-99 */ } ClockStruc; // 函数声明 void GetCurrentTime(ClockStruc *ptClock); void Sleep(UINT32 iCountMs); INT32 main(); /********************************************************************** * 功能描述:主函数 * 输入参数:无 * 输出参数:无 * 返 回 值:无 * 其它说明:无 * 修改日期 版本号 修改人 修改内容 * --------------------------------------------------------------- * 20150430 V1.0 Zhou Zhaoxiong 创建 ***********************************************************************/ INT32 main() { UINT8 szCurrentTime[50] = {0}; ClockStruc tClock = {0}; // 开始日期 GetCurrentTime(&tClock); // 打印开始时间(YYYY.MM.DD HH:MIN:SS) snprintf(szCurrentTime, sizeof(szCurrentTime) - 1, "%04d.%02d.%02d %02d:%02d:%02d", tClock.year, tClock.month, tClock.day, tClock.hour, tClock.minute, tClock.second); printf("Begin time: %s\n", szCurrentTime); // 休眠10s Sleep(10 * 1000); // 结束日期 GetCurrentTime(&tClock); // 打印结束时间(YYYY.MM.DD HH:MIN:SS) snprintf(szCurrentTime, sizeof(szCurrentTime) - 1, "%04d.%02d.%02d %02d:%02d:%02d", tClock.year, tClock.month, tClock.day, tClock.hour, tClock.minute, tClock.second); printf("End time: %s\n", szCurrentTime); return 0; // main函数返回0 } /********************************************************************** * 功能描述: 获取当前时间 * 输入参数: ptClock-时间结构体 * 输出参数: 无 * 返 回 值: 无 * 其它说明: 无 * 修改日期 版本号 修改人 修改内容 * ------------------------------------------------------------------ * 20150430 V1.0 Zhou Zhaoxiong 创建 ********************************************************************/ void GetCurrentTime(ClockStruc *ptClock) { LONG iDate = 0; struct tm *ptTime = NULL; struct timeval t_timeval = {0}; gettimeofday(&t_timeval, NULL); iDate = t_timeval.tv_sec; ptTime = localtime(&iDate); ptClock->Count10ms = t_timeval.tv_usec / 10000; ptClock->year = (UINT16)(ptTime->tm_year + 1900); ptClock->month = (UINT8)ptTime->tm_mon + 1; ptClock->day = (UINT8)ptTime->tm_mday; ptClock->hour = (UINT8)ptTime->tm_hour; ptClock->minute = (UINT8)ptTime->tm_min; ptClock->second = (UINT8)ptTime->tm_sec; ptClock->week = (UINT8)ptTime->tm_wday; if (ptClock->week == 0) { ptClock->week = 7; } } /********************************************************************** * 功能描述: 程序休眠 * 输入参数: iCountMs-休眠时间(单位:ms) * 输出参数: 无 * 返 回 值: 无 * 其它说明: 无 * 修改日期 版本号 修改人 修改内容 * ------------------------------------------------------------------ * 20150430 V1.0 Zhou Zhaoxiong 创建 ********************************************************************/ void Sleep(UINT32 iCountMs) { struct timeval t_timeout = {0}; if (iCountMs
程序运行结果
在Linux下使用“gcc-g -o Sleep Sleep.c”命令对程序进行编译,成功之后,执行“Sleep”命令,结果如下:
Begin time: 2015.04.3013:36:40
End time: 2015.04.30 13:36:50
可见,程序在“2015.04.30 13:36:40”和“2015.04.30 13:36:50”之间休眠了10秒。
-------------------------------
本人微信公众号:zhouzxi,请扫描以下二维码: