头歌实验6:Linux时间编程

这篇具有很好参考价值的文章主要介绍了头歌实验6:Linux时间编程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第一关

任务:
获取当前时间距离 1970 年 1 月 1 日凌晨的秒数;
获取当前的本地的时间,并将时分秒分别赋值给对应的参数。

不管了,先上答案:

time_t gettimesecond (void)
{
	/*************Begin***********/
	
	return time(NULL);
	
	
	/**************End************/
}

void getlocaltv (localtimestruct *ltinfo)
{
	/*************Begin***********/
	
	time_t t;
    struct tm *st = localtime(&t);
    ltinfo->year = st->tm_year;
    ltinfo->month = st->tm_mon;
    ltinfo->day = st->tm_mday;
    ltinfo->hour = st->tm_hour;
    ltinfo->minute = st->tm_min;
    ltinfo->second = st->tm_sec;
    
	/**************End************/
}

第二关

任务:
本关的编程任务是补全右侧代码片段 timetrans 和 getdifftimeval 中Begin至End中间的代码,具体要求如下:

在 timetrans 中,根据秒数计算对应的字符串时间、年月日时分秒和格林威治时间,并将转换得到的时间赋给相应的参数;
在 getdifftimeval 中调用函数 func,并利用 gettimeofday 计算 func 的耗时,并返回耗时(单位为微妙数)。
上答案先:

void timetrans (time_t current, char *time_str, localtimestruct *ltinfo, struct tm *tm_time)
{
	/*************Begin***********/
	
    
    memcpy(time_str,ctime(&current),strlen(ctime(&current)));
    memcpy(tm_time,gmtime(&current),sizeof(struct tm));
    ltinfo->year = tm_time->tm_year+1900;
    ltinfo->month = tm_time->tm_mon+1;
    ltinfo->day = tm_time->tm_mday;
    ltinfo->hour = tm_time->tm_hour;
    ltinfo->minute = tm_time->tm_min;
    ltinfo->second = tm_time->tm_sec;
	
	/**************End************/ 
}

long getdifftimeval (void)
{
	/*************Begin***********/
	struct timeval t1;
    struct timeval t2;
    gettimeofday(&t1,NULL);
    func();
    
    gettimeofday(&t2,NULL);
    long ans = (t2.tv_sec*1000*1000+t2.tv_sec)-(t1.tv_sec*1000*1000+t1.tv_sec);
	
	return ans;
	
	/**************End************/
}

第三关

任务:
本关的编程任务是补全右侧代码片段 setlocaltimer 和 loopevent 中Begin至End中间的代码,具体要求如下:

在 setlocaltimer 中,设定 3s 后第一次启动定时器;
每隔 1s 触发调用一次 loopevent;
在 loopevent 中调用 func;
loopevent 循环 5 次后,取消定时器。
注:使用 ITIMER_PROF 类型的定时器。
上答案:

void loopevent (int signo)
{
	/************Begin************/
	
	if(SIGPROF == signo)
    {
        func();
        if(4>count)
        {
            count++;
        }
        else
        {
            struct itimerval new_it;
            new_it.it_interval.tv_sec = 0;
            new_it.it_interval.tv_usec = 0;
            new_it.it_value.tv_sec = 0;
            new_it.it_value.tv_usec = 0;
        }
    }
	
	
	/*************End*************/
}

void setlocaltimer (void)
{
	/************Begin************/
	struct itimerval new_it;
    struct itimerval old_it;
    struct sigaction act;
    act.sa_handler = loopevent;
    act.sa_flags = 0;
    sigemptyset(&act.sa_mask);
    sigaction(SIGPROF,&act,NULL);
    new_it.it_interval.tv_sec = 1;
    new_it.it_interval.tv_usec = 0;
    new_it.it_value.tv_sec = 3;
    new_it.it_value.tv_usec = 0;
	
	setitimer(ITIMER_PROF, &new_it,&old_it);
	
	/*************End*************/
}

说明,使用汇总:

1,获取时间秒数,如下

time_t time(time_t *t);
time_t t;
time_t t(NULL)

其实以上的几种差不多,都这样弄出来就可以显示时间秒数了。
当然返回值是:1970 年 1 月 1 日凌晨以来的秒数。

2,tm结构体获取本地时间

struct tm * localtime(const time_t * timer);//函数原型
//具体使用如下:
struct tm *current;
time_t now_second;
current = localtime(&now_second);

值得注意的是,tm里面的一些值是有范围的,需要好好注意
头歌实验6:Linux时间编程,头头操作系统做题记录,linux

3,time_t时间转字符串时间

char * ctime(const time_t *timer);//函数原型
//使用:
time_t t;
char *str;
memcpy(str,ctime(&t),strlen(ctime(&t)));//这个是C语言的字符串赋值

4,tm结构体时间转字符串

char *asctime(const struct tm *tm);//函数原型
//使用:
time_t t;
struct tm *a = localtime(&t);
char *str;
memcpy(str,asctime(&t),strlen(asctime(t)));

5,time_t 时间转成格林威治时间

struct tm * gmtime(const time_t *timer); //函数原型
//使用
struct tm * tm_time;
time_t t;
memcpy(tm_time,gmtime(&t),sizeof(struct tm));

值得注意的是
结构体时间若是要转变成你想要的时间的话,
那么在返回年的时候要加1900
月的时候要加1
如下:

ltinfo->year = tm_time->tm_year+1900;
ltinfo->month = tm_time->tm_mon+1;

6,tm 结构体时间转成 time_t 时间

time_t mktime(struct tm * timeptr);//函数原型

7,获取微秒级时间

int gettimeofday(struct timeval *tv, struct timezone *tz);//函数原型
//使用:
struct timeval t1;
gettimeofday(&t1,NULL);
long thet;
thet = t1.tv_sec*1000*1000+t1.tv_sec;
//这里的thet就是返回的微秒级时间啦
// timeval结构体
struct timeval {
time_t      tv_sec;/* seconds */
suseconds_t tv_usec;/* microseconds */
};

--------

在 Linux 编程中,一种很常见的定时控制是采用 sleep 来控制,这可以满足一些程序的定时需要,但是这种控制方法有一个很大的缺点,即整个应用程序在 sleep 过程中会睡眠,不会做任何事情。
如果您不希望程序偷懒,即上例中 sleep 的时候依旧希望程序做些有用的工作,那么使用定时器是通常的选择。 Linux 系统上可以使用 setitmer 来实现定时器。

8,setitimer 定时器

Linux 提供了 3 种 setitimer 间隔计时器:

ITIMER_REAL:以系统真实的时间来计算,时间间隔到的时候会发出 SIGALRM 信号;
ITIMER_VIRTUAL:以该进程在用户态下花费的时间来计算,产生 SIGVTALRM 信号;
ITIMER_PROF:以该进程在用户态下和内核态下所费的时间来计算,产生 SIGPROF 信号。
接口原型:

#include <sys/time.h> 
int setitimer(int which, const struct itimerval *new_value,  
            struct itimerval *old_value);  

头歌实验6:Linux时间编程,头头操作系统做题记录,linux

参数详解如下:

which:定时器类型,即为上面提到的三种类型: ITIMER_REALITIMER_VIRTUALITIMER_PROF
new_value:指向 itimerval 变量的指针,表示设定定时器的时间属性;
old_value:指向 itimerval 变量的指针,一般设为 NULL ;如果不为 NULL,则表示距离定时器下一次触发的时间。
返回值:调用成功时,返回 0 ;错误时,返回 -1 ,并设置相应的错误代码 errno:

EFAULT:参数 new_valueold_value 是无效的指针。

EINVAL:参数 which 不是 ITIMER_REALITIMER_VIRTITIMER_PROF 中的一个。

取消定时器的方法,将"new_value"it_value 设为 0,并调用 setitimer 即可。
使用举例:文章来源地址https://www.toymoban.com/news/detail-745777.html

#include <sys/time.h>
......
signal(SIGALRM, handler);
struct timeval tv_interval = {1, 0};
struct timeval tv_value = {5, 0};
struct itimerval it;
it.it_interval = tv_interval;
it.it_value = tv_value;
setitimer(ITIMER_REAL, &it, NULL);
......
it.it_interval.tv_sec = 0;
it.it_interval.tv_usec = 0;
it.it_value.tv_sec = 0;
it.it_value.tv_usec = 0;
setitimer(ITIMER_REAL, &it, NULL);

到了这里,关于头歌实验6:Linux时间编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux操作系统】【综合实验一 Linux操作基础】【浅试Linux命令】

    Linux均以文件形式存在 本文出现的命令浅尝辄止,具体使用参考文档即可 解决一个任务的方法很多,本文仅浅试了一些简单的命令 要求掌握Linux基础操作,熟悉Linux行界面,并 明白操作的原理以及目的(难) ;熟悉Linux系统环境。 通过这个第一阶段实验,要求掌握以下操作

    2023年04月08日
    浏览(98)
  • 大数据编程实验一:HDFS常用操作和Spark读取文件系统数据

    这是我们大数据专业开设的第二门课程——大数据编程,使用的参考书是《Spark编程基础》,这门课跟大数据技术基础是分开学习的,但这门课是用的我们自己在电脑上搭建的虚拟环境进行实验的,不是在那个平台上,而且搭建的还是伪分布式,这门课主要偏向于有关大数据

    2024年04月10日
    浏览(52)
  • Linux 操作系统——查看/修改系统时区、时间、本地时间修改为UTC

    最近一个项目日期采用java8的LocalDate 和 LocalDateTime ,在本地windows 下运行,日期没有问题,但是当部署到linux 系统上时,相差8 小时,第一时间想到时linux 服务器日期和时间设置的问题。果断登陆linux 服务器查看。 GMT(Greenwich Mean Time,格林威治标准时间): 是指位于英国伦敦郊区

    2024年02月07日
    浏览(65)
  • Linux操作系统实验三 文件管理(一)

      1.实验目的与要求 了解Linux文件系统目录结构 掌握目录管理的相关操作 掌握文件管理的相关操作 2.实验平台 实验室安装的实验环境(Linux操作系统)和头歌(www.educoder.net)实验平台(课程实验) 3.实验内容 文件系统目录结构理论知识练习 linux 下目录的创建、应用、查看、

    2024年02月03日
    浏览(52)
  • 【操作系统实验】Ubuntu Linux 虚拟机用户管理

    Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户都必须先向系统管理员申请一个账号,然后以这个账号的身份进入系统。 在Linux系统中,任何文件都属于某一特定用户,而任何用户都隶属于至少一个用户组。 用户名(username) :每个用户账号都

    2023年04月24日
    浏览(77)
  • Linux下C程序的编写(操作系统实验)

    实验题目:   Linux下C程序的编写                            实验目的:   (1)掌握Linux下C程序的编写、编译与运行方法; (2)掌握gcc编译器的编译过程,熟悉编译的各个阶段;        (3)熟悉Makefile文件的编写格式和make编译工具的使用方法。        

    2024年04月28日
    浏览(52)
  • Linux操作系统实验:生产者和消费者问题

    “生产者消费者”问题是一个著名的同时性编程问题的集合。通过编写经典的”生产者消费者”问题的实验,读者可以进一步熟悉 Linux 中多线程编程,并且掌握用信号量处理线程间的同步互斥问题。 VMware Workstation Pro “生产者消费者”问题描述如下。 有一个有限缓冲区和两

    2024年02月06日
    浏览(53)
  • Linux操作系统--shell编程(流程控制)

    1.if 条件判断 ①.单分支判断 if [ 条件判断式 ];then 程序 fi 该语法结构还可以写成: if [ 条件判断式 ] then 程序

    2024年02月11日
    浏览(50)
  • 【Linux操作系统】【综合实验三 用户帐号、文件系统与系统安全管理】

    要求掌握Linux系统用户的创建、删除与管理操作;熟悉Linux文件系统的管理模式,学会创建用户文件系统并装载和卸载文件系统;掌握超级用户的管理方式与权限,并实施对普通用户的管理;熟悉Linux系统安全机制与相关管理方法。 通过这个第三阶段实验,要求掌握以下操作与

    2023年04月14日
    浏览(35)
  • Linux下的系统编程——基础操作(一)

    前言: linux系统编程是基于Linux系统进行程序开发的一个过程,主要涉及到的是linux系统中的函数使用如下图所示: 最外层的是咱们的应用程序,这部分程序大多调用的是咱们标准库,或者说是C库,这部分库函数能满足大部分的应用程序的开发,但是这部分库函数访问硬件的

    2024年02月11日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包