2023年7月22日,周六上午
目录
预备知识
Linux系统函数sysconf
函数原型
sysconf
是一个缩写形式,其英文全称是 "System Configuration",意为 "系统配置"。
这个函数名反映了它的用途,即用于查询和获取系统的运行时配置信息。
通过调用 sysconf
函数,可以获取诸如最大文件数、页面大小、最大参数长度等与系统配置相关的信息。这些信息对于程序的正确运行和优化往往非常重要。
#include<unistd.h>
long sysconf(int name);
参数name用于指明要查询系统选项中的哪一项
sysconf
函数返回一个 long
类型的值,表示相应系统配置选项的值。如果查询失败或选项不可用,则返回-1。
参数介绍
在参数name里,可以填写如下宏:
_SC_ARG_MAX
:最大参数长度_SC_CHILD_MAX
:最大子进程数_SC_CLK_TCK
:每秒的时钟滴答数_SC_NGROUPS_MAX
:每个进程可拥有的最大组数_SC_OPEN_MAX
:每个进程可打开的最大文件数_SC_PAGESIZE
:页面大小_SC_RTSIG_MAX
:实时信号最大数_SC_STREAM_MAX
:每个进程可打开的最大流数_SC_TZNAME_MAX
:时区名的最大长度_SC_JOB_CONTROL
:是否支持作业控制_SC_SAVED_IDS
:是否支持保存的用户ID和组ID_SC_VERSION
:POSIX.1 版本号
使用方法
#include<unistd.h>
#include<stdio.h>
int main(){
//查询最大子进程数
printf("child max:%ld\n",sysconf(_SC_CHILD_MAX));
//查询每秒的时钟滴答数
printf("clock tick per sec:%ld\n",sysconf(_SC_CLK_TCK));
}
数据类型clock_t
数据类型
clock_t 是一个整型值,代表时间度量单位"时钟计时单元(clock tick)"的数量
问题来了,我怎么知道一个“时钟计时单元”等于多少秒呢?
通过对sysconf的学习,已经知道通过调用sysconf(_SC_CLK_TCK)可以得到每秒会产生多少个“时钟计时单元”
那么“时钟计时单元”除以sysconf(_SC_CLK_TCK)就可以把“时钟计时单元”的数量转换成秒
times
函数原型
这是一个Linux系统特有的函数
#include<sys/times.h>
clock_t times(struct tms *buf);
tms结构体
使用方法
#include<sys/times.h>
#include<unistd.h>
#include<stdio.h>
int main(){
int i;
struct tms time1,time2;
long tick=sysconf(_SC_CLK_TCK);
times(&time1);
printf("User time=%.2fs,System time=%.2fs\n",
(double)time1.tms_utime/tick,(double)time1.tms_stime/tick);
//如果不强制转换成double类型,那么除出来的数会为零
for(i=0;i<1000000000;i++);
times(&time2);
printf("User time=%.2fs,System time=%.2fs\n",
(double)time2.tms_utime/tick,(double)time2.tms_stime/tick);
//如果不强制转换成double类型,那么除出来的数会为零
}
clock
函数原型
clock是C语言的函数,而不是Linux特有的系统函数,而times是Linux特有的系统函数
这意味着,虽然返回值都是clock_t,但二者是由区别的:
Linux的系统函数times返回的clock_t,每秒的产生数量等于sysconf(_SC_CLK_TCK)的返回值,在Cent0S 7里是100
C语言函数clock返回的clock_t,每秒的产生数量等于宏CLOCKS_PER_SEC,其实就是10000
#include<time.h>
clock_t clock(void);
使用方法
#include<time.h>
#include<stdio.h>
int main(){
int i;
clock_t time1,time2;
time1=clock();
printf("time1=%.2fs\n",(double)time1/CLOCKS_PER_SEC);
//如果不强制转换成double类型,那么除出来的数会为零
for(i=0;i<1000000000;i++);
time2=clock();
printf("time2=%.2fs\n",(double)time2/CLOCKS_PER_SEC);
//如果不强制转换成double类型,那么除出来的数会为零
}