前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux笔记(7)| 获取系统信息

Linux笔记(7)| 获取系统信息

作者头像
飞哥
发布2020-07-10 10:29:04
1.7K0
发布2020-07-10 10:29:04
举报
文章被收录于专栏:电子技术研习社

今天分享的是Linux中获取系统信息。主要介绍获取时间信息以及产生随机数。

一、linux中时间相关的系统调用

1、time函数

函数原型:

代码语言:javascript
复制
time_t time(time_t *tloc);

time能得到一个当前时间距离标准起点时间1970-01-0100:00:00 +0000(UTC)过去了多少秒。

2、ctime和ctime_r函数

函数原型:

代码语言:javascript
复制
char *ctime(const time_t *timep);
char *ctime_r(const time_t *timep, char *buf);

(1)ctime可以从time_t出发得到一个容易观察的字符串格式的当前时间。

(2)ctime好处是很简单好用,可以直接得到当前时间的字符串格式,直接打印来看。坏处是ctime的打印时间格式是固定的,没法按照我们的想法去变。

(3)实验结果可以看出ctime函数得到的时间是考虑了计算机中的本地时间的(计算机中的时区设置)

注意这两个函数的区别:实际上,这两个函数几乎没有区别,主要的不同是第一个函数不需要自己定义一段内存空间,而第二个函数需要自己定义一段内存空间作为输出型参数,我们可以定义一个char类型的数组,如果第二个参数直接传入一个char类型的指针,虽然编译没问题,但是运行会发生段错误,这是因为越界了。

3、gmtime和gmtime_r函数

函数原型:

代码语言:javascript
复制
struct tm *gmtime(consttime_t *timep);
struct tm *gmtime_r(consttime_t *timep, struct tm *result);

这个函数得到的信息主要是在结构体中

代码语言:javascript
复制
struct tm {
               int tm_sec;    /* Seconds (0-60) */
               int tm_min;    /* Minutes (0-59) */
               int tm_hour;   /* Hours (0-23) */
               int tm_mday;   /* Day of the month (1-31) */
               int tm_mon;    /* Month (0-11) */
               int tm_year;   /* Year - 1900 */
               int tm_wday;   /* Day of the week (0-6, Sunday = 0) */
               int tm_yday;   /* Day in the year (0-365, 1 Jan = 0) */
               int tm_isdst;  /* Daylight saving time */
           };

这两个函数的作用也是一样的,区别就在于输入参数,第二个函数的第二个输入参数是一个结构体类型的指针,同样的也是输入型参数,所以我们应该先定义一个结构体变量,然后将它的地址传进去。返回值是一个结构体指针,就是指向我们定义的那个结构体变量,因此,它的结果我们既可以用结构体变量访问,也可以用结构体指针访问。

4、localtime和localtime_r函数

函数原型:

代码语言:javascript
复制
struct tm *localtime(const time_t *timep);
struct tm *localtime_r(const time_t *timep, struct tm *result);

实际上,这两个函数和上面的没什么很大的区别,主要区别在于这个函数在计算时间的时候,加上了本地的时区,比如在上面的函数中获取的小时数是0时区的,而我们用localtime函数获取的是东8区的(北京时间)。

当然,这个和你的系统有关,首先得保证你的系统时间是没有问题的。

此外,还有mktime和asctime函数,其实功能都差不多,这里不再多说。

5、strftime函数

函数原型:

代码语言:javascript
复制
size_t strftime(char *s, size_t max, const char *format,
                       const struct tm *tm);

(1)asctime和ctime得到的时间字符串都是固定格式的,没法用户自定义格式

(2)如果需要用户自定义时间的格式,则需要用strftime。

这个函数的第一个参数是返回的字符串,第二个参数是用户想要的格式,它提供了很多格式可以自由选择,比如想要打印出年份,就可以写%Y,具体的可以查看手册。注意要写成字符串的格式。第三个参数就还是那个结构体变量的地址。

6、gettimeofday和settimeofday

(1)前面讲到的基于time函数的那个系列都是以秒为单位来获取时间的,没有比秒更精确的时间。

(2)有时候我们程序希望得到非常精确的时间(譬如以us为单位),这时候就只能通过gettimeofday来实现了。

二、linux中使用随机数

随机数和伪随机数:

(1)随机数是随机出现,没有任何规律的一组数列。

(2)真正的完全随机的数列是不存在的,只是一种理想情况。我们平时要用到随机数时一般只能通过一些算法得到一个伪随机数序列。

(3)我们平时说到随机数,基本都指的是伪随机数。

1、rand函数和srand函数

代码语言:javascript
复制
int rand(void);
int rand_r(unsigned int *seedp);
void srand(unsigned int seed);

连续多次调用rand函数可以返回一个伪随机数序列,srand函数用来设置rand获取的伪随机序列的种子

(1)单纯使用rand重复调用n次,就会得到一个0-RAND_MAX之间的伪随机数,如果需要调整范围,可以得到随机数序列后再进行计算。

(2)单纯使用rand来得到伪随机数序列有缺陷,每次执行程序得到的伪随机序列是同一个序列,没法得到其他序列

(3)原因是因为rand内部的算法其实是通过一个种子(seed,其实就是一个原始参数,int类型),rand内部默认是使用1作为seed的,种子一定的算法也是一定的,那么每次得到的伪随机序列肯定是同一个。

(4)所以要想每次执行这个程序获取的伪随机序列不同,则每次都要给不同的种子。用srand函数来设置种子。

总结和说明:(1)在每次执行程序时,先用srand设置一个不同的种子,然后再多次调用rand获取一个伪随机序列,这样就可以每次都得到一个不同的伪随机序列。

(2)一般常规做法是用time函数的返回值来做srand的参数。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 电子技术研习社 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档