程序休眠问题的C代码实现

简介: 问题描述编写代码用于实现程序的休眠,例如,如果要求程序休眠10秒钟,那么在这10秒内程序要一直等待,而不执行任何操作。 解决思路在Linux下,有一个select函数用于实现进程的阻塞,该函数的原型是:int select(int n, fd_set *readfds,fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);可以用该函数来实现程序的休眠。

问题描述

编写代码用于实现程序的休眠,例如,如果要求程序休眠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,请扫描以下二维码:

 

目录
相关文章
|
1月前
|
存储 算法 编译器
如何优化单片机程序里面的C代码方法
如何优化单片机程序里面的C代码方法
20 0
|
8月前
|
调度
在 代码运行前加 strace 可以查看函数调度进程
在 代码运行前加 strace 可以查看函数调度进程
|
9月前
在多线程中某段代码只执行一次
使用Automic包中的AtomicBoolean结合CAS来实现。当只希望需要某段代码在多线程中只执行一次的时候,此时你会发现boolean这个变量类型是多么有用。
81 0
|
9月前
|
C++
C++中如何调用C代码
C++中如何调用C代码
56 1
|
11月前
编写使用中断的按键驱动程序
编写使用中断的按键驱动程序
82 0
|
存储 编译器 C语言
Win知识 - 程序是怎样跑起来的——函数调用机制
Win知识 - 程序是怎样跑起来的——函数调用机制
81 0
Win知识 - 程序是怎样跑起来的——函数调用机制
|
调度
线程调度之多线程循环打印ABCABC
参考: https://blog.csdn.net/qq_32655383/article/details/51660925 但是我有点看不明白,于是就自己改写了下,后面分析。线程类: package threadabc; public class ThreadPrint implements ...
1211 0
|
测试技术 开发工具 数据安全/隐私保护
rsync代码同步
数据差异同步
1965 0