木头骑士的Linux编程实验室(一)——时间、错误、限制
#include <time.h>
time_t time(time_t *calptr);
#include <sys/time.h>
int clock_gettime(clockid_t clock_id, struct timespec *tsp);
#include <sys/time.h>
int gettimeofday(struct timeval *restrict tp,struct timezone *tz);
设置时间的函数:
#include <sys/time.h>
int settimeofday(const struct timeval *tv, const struct timezone *tz);
#include <sys/time.h>
int adjtime(struct timeval *delta, struct timeval *olddelta);
时间格式转换函数:
#include <time.h>
struct tm *gmtime(const time_t *calptr);
struct tm *localtime(const time_t *calptr);
#include <time.h>
time_t mktime(struct tm *tmptr);
#include <time.h>
size_t strftime(char *restrict buf, size_t maxsize, const char *restrict format, const struct tm *restrict tmptr);
size_t strftime_l(char *restrict buf, size_t maxsize, const char *restrict format, const struct tm *restrict tmptr, locale_t locale);
#include <time.h>
char *strptime(const char *restrict buf, const char *restrict format, struct tm *restrict tmptr);
time_t tv_sec; // 秒
long tv_nsec; // 纳秒
gettimeofday函数在SUSv4中已被标记为弃用,该函数提供了比time更高的精度(到微秒级)。第一个参数用于返回时间,timeval结构如下:
struct timeval {time_t tv_sec; // 从Epoch开始的秒数suseconds_t<span style="font-family:微软雅黑;"> </span>tv_usec; // 额外的微秒数(long int)
};
struct tm {int tm_sec; // 秒数(0-60)int tm_min; // 分钟数(0-59)int tm_hour; // 小时数(0-23)int tm_mday; // 日数(1-31)int tm_mon; // 月数(0-11)int tm_year; // 从1900年算起的年数int tm_wday; // 从周日算起的星期数(0-6)int tm_yday; // 从一月一日起的日数(0-365)int tm_isdst; // 夏令时标志(小于0表示不使用该标志,等于零表示非夏令时,大于0表示夏令时)
};
OK,有了这几个函数的准备,我们就可以看看实验一下获取当前的时间了。准备下面一段程序:
#include <stdio.h>
#include <time.h>
#include <sys/time.h>#include "timeTest.h"void print_tm(const struct tm *ptm){printf("tm_sec: %d\n", ptm->tm_sec);printf("tm_min: %d\n", ptm->tm_min);printf("tm_hour: %d\n", ptm->tm_hour);printf("tm_mday: %d\n", ptm->tm_mday);printf("tm_mon: %d\n", ptm->tm_mon);printf("tm_year: %d\n", ptm->tm_year);printf("tm_wday: %d\n", ptm->tm_wday);printf("tm_yday: %d\n", ptm->tm_yday);printf("tm_isdst: %d\n", ptm->tm_isdst);
}void timeTest(){printf("==========timeTest1==========\n");time_t paratime;time(<span style="font-family:微软雅黑;">&</span>time);printf("test gmtim():\n");struct tm *utc_tm = gmtime(<span style="font-family:微软雅黑;">&</span>time);print_tm(utc_tm);printf("test localtime():\n");struct tm *loc_tm = localtime(<span style="font-family:微软雅黑;">&</span>time);print_tm(loc_tm);printf("==========timeTest2==========\n");printf("test clock_gettime():\n");struct timeval tvl;clock_gettime(CLOCK_REALTIME, &tvl);utc_tm = gmtime(&tvl.tv_sec);print_tm(utc_tm);printf("micro second: %ld\n", tvl.tv_usec);printf("==========timeTest3==========\n");printf("test mktime()\n");time_t ttmp = mktime(utc_tm);printf("time_t from mktime() is: %ld\n", ttmp);
}
print_tm用来打印一个tm结构,timeTest函数测试了两个获取日历时间的函数time和clock_gettime。然后用gmtime和localtime将获取到的秒数转换为tm结构,并打印出来。下面是该函数的执行结果:
37个转换符,就不一一测试了,这里使用《APUE》中的代码做一个测试,代码如下:
void timePrintTest(){time_t t;struct tm *tmp;char buf1[16];char buf2[64];time(&t);tmp = localtime(&t);if (strftime(buf1, 16, "time and date: %r, %a, %b, %d, %Y", tmp) == 0)printf("buffer length 16 is too small\n");elseprintf("%s\n", buf1);if (strftime(buf2, 64, "time and date: %r, %a, %b, %d, %Y", tmp) == 0)printf("buffer length 64 is too small\n");elseprintf("%s\n", buf2);struct tm tmp2;char *p = buf2 + strlen("time and date: ");if (NULL == strptime(p, "%r, %a, %b, %d, %Y", &tmp2)) {printf("some error occured\n");}print_tm(&tmp2);
}
1.2进程时间
- 用户CPU时间是在用户模式下执行所花费的时间数量。有时也成为虚拟时间(virtual time),这对于程序来说,是它已经得到的CPU的时间。
- 系统CPU时间是在内核模式中执行所花费的时间数量。这是内核用于执行系统调用或代表程序执行的其他任务(例如,服务页错误)的时间。
#include <sys/times.h>
clock_t times(struct tms *buf);
该函数将调用该函数的进程时间信息放到buf指向的结构体中。tms结构体格式如下:
struct tms {clock_t tms_utimes; // 调用进程的用户CPU时间clock_t tms_stimes; // 调用进程的系统CPU时间clock_t tms_cutime; // 等待的所有子进程的用户CPU时间clock_t tms_cstime; // 等待的所有子进程的系统CPU时间
};
void printTimes(struct tms *buf){long clockTicks = sysconf(_SC_CLK_TCK);printf("tms_utime on seconds: %.2f\n", (double)(buf->tms_utime)/clockTicks);printf("tms_stime on seconds: %.2f\n", (double)(buf->tms_stime)/clockTicks);printf("tms_cutime on seconds: %.2f\n", (double)(buf->tms_cutime)/clockTicks);printf("tis_cstime on seconds: %.2f\n", (double)(buf->tms_cstime)/clockTicks);
}void sysTimeTest(){//long clockTicks = sysconf(_SC_CLK_TCK);printf("sysconf(_SC_CLK_TCK): %ld\n", sysconf(_SC_CLK_TCK));struct tms buf;int i = 0;//clock_t start = clock();for(i = 0; i < 1000000; i++)getppid();times(&buf);clock_t tmp = clock();printf("after 100000 times getppid(), test times()\n");printTimes(&buf);printf("and test clock()\n");printf("clock() value on seconsd: %.2f\n", (double)tmp/CLOCKS_PER_SEC);
}
这里将getppid这个系统调用执行100000此,观察使用的进程时间,执行结果如下:
可以看到,clock的结果是用户进程时间和系统集成时间的和。由于该进程在本实验中没有创建子进程,所以times结果的后面两个字段都是0。
2.错误
#include <string.h>
char *strerror(int errnum);
该函数返回一个字符串,用于说明错误信息。
#include <stdio.h>
void perror(const char *msg);
void errorTest(){if (-1 == open("/tmp/rootfile", O_RDONLY)) {int err = errno;printf("strerror() test:\n");printf("%s\n", strerror(err));printf("perror() test:\n");perror("perror");}
}
3.限制
POSIX限制:
还有一些限制值需要在运行时才能确定,这种限制又分为两类,一类是与文件无关的限制,一种是与文件有关的限制,与文件无关的限制通过sysconf函数在运行时获取,与文件有关的限制可通过pathconf或fpathconf在运行时获取。三个函数的原型为:
#include <unistd.h>
long sysconf(int name);
long pathconf(const char *pathname, int name);
long fpathconf(int fd, int name);返回值:成功,返回相应值,出错返回-1
其中的name参数的取值见如下两个图:
在时间部分的试验中,我们已经通过sysconf(_SC_CLK_TCK)获取了每秒钟的时钟滴答数,其他运行时限制的获取与此相似。
说明:本文的实验使用eclipse建立工程,已上传至github:
https://github.com/haoranzeus/LinuxProgrammingLib.git
木头骑士的Linux编程实验室(一)——时间、错误、限制相关推荐
- 遇到一个Linux文件系统因bios时间错误变成只读的问题
正在进行的项目所用的系统是基于ubuntu构建的,前文也有说明.由于某些原因,需要在一块主板上用dd命令拷贝已经做好的系统镜像到硬盘,然后将这个硬盘换到另一块板子上使用.近期发现一个问题,就是将拷贝好 ...
- Linux编程:mktime通过时间获取时间戳
Linux编程:获取GMT(UTC)与Local时间,及其线程安全_风静如云的博客-CSDN博客 描述了如果通过时间戳获取对应的UTC及Local时间. Linux提供了函数mktime用于完成反向操 ...
- Linux编程获取网络信息总结
Linux下C获取所有可用网卡信息 在Linux下开发网络程序时,经常会遇到需要取本地网络接口名.IP.广播地址 .子网掩码或者MAC地址等信息的需求,最常见的办法是配合宏SIOCGIFHWADDR. ...
- linux的编程命令,linux编程常用命令
学习linux编程最基本的就是要掌握常用的编程命令,下面由学习啦小编为大家整理了linux编程常用命令相关知识,希望大家喜欢! linux编程常用命令1.编译应用程序 make -f makefile ...
- 想学python都要下载什么软件-学编程闲余时间建议下载的软件_Python新手入门教程...
原标题:学编程闲余时间建议下载的软件_Python新手入门教程 Python新手入门教程_在手机上就能学习编程的软件 很多小伙伴会问:我在学编程,想利用坐地铁坐公交吃饭间隙学编程,在手机上能学编程的软 ...
- 学习Unix/Linux编程要学些什么
最近利用空余时间看了一下<Unix/Linux编程实践教程>,原书名为:Understanding Unix/Linux Programming: A Guide to Theory an ...
- 牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结...
网站地址:http://www.itmian4.com 基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. ...
- RHCE实验室NTP时间服务器配置最终版
以RHCE实验室为准,一个简单的NTP时间服务器标准配置如下: 服务器端: 首先修正下系统时间,并将系统时间写进硬件时间里 date MMDDhhmmYYYY.ss;hwclock -w vim /e ...
- linux编程参数列表,Linux编程 14 文件权限(用户列表passwd,用户控制shadow,useradd模板与useradd命令参数介绍)...
一. 概述 linux安全系统的核心是用户账户. 创建用户时会分配用户ID(UID). UID是唯一的,但在登录系统时不是用UID,而是用登录名.在讲文件权限之之前,先了解下linux是怎样处理用户账 ...
最新文章
- 【深度】清华黄高等人新作:动态神经网络首篇综述
- python显示图片
- python数据科学讲解_数据科学的概念-Python数据科学技术详解与商业项目实战精讲 - Python学习网...
- SQL语句inner join,left join ,right join连接的不同之处
- 幅度调制(AM调制、DSB(双边带)调制、SSB、VSB)
- centos系统mysql连接workbench
- Docker-创建支持ssh服务的镜像
- 手把手教你创建 Alexa Smart Home Skill (二)
- CRM系统提高企业核心竞争力
- mac忘记mysql用户名和密码_mac 下 忘记mysql密码如何找回
- PulseAudio安装流程
- 关于IE主页被篡改成2345、360、hao123等页面的说明
- 程序人生之项目团队那些人与事(1)
- json解析教程(1)程序员不得不掌握的数据格式json
- Spirent Testcenter基本配置使用说明_1022
- 数据库实战20_获取所有员工的emp_no、部门编号dept_no以及对应的bonus类型btype和received,没有分配奖金的员工不显示对应的bonus类型btype和received
- 招生通知+4,北京大学计算机学院+中国科学技术大学信息技术学院+吉林大学人工智能学院+深圳大学计算机学院
- 编程实现AdaBoost算法
- 变革的腾讯:一个游戏之外的帝国
- 大学生简单个人静态HTML网页设计作品 DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载 明星个人主页介绍(10页) HTML+CSS+JavaScript
热门文章
- 淘宝店铺托管打造人群的目的是什么?
- 金山词霸无法屏幕取词的解决方法
- 由一种颜色得到对应的浅色及深色
- 国产网管软件的本土化及其发展
- 使用VUE(uniapp)和Spring boot做的小游戏 远古帝国
- fedora23_x86_64通过dnf升级到fedora24
- Android中定位经纬度问题
- jeecgboot vue2启动后台报错 jeecgboot ERROR o.s.d.redis.listener.RedisMessageListenerContainer:665 - Connec
- Java学习笔记-Day42 HTML概述
- 服务器高并发处理/服务器宕机了怎么处理?