系统信息与系统资源
一、获取系统相关的信息
系统标识 uname
-
用于获取有关当前操作系统内核的名称和信息
-
#include <sys/utsname.h>
int uname(struct utsname *buf);-
buf:struct utsname 结构体类型指针,指向一个 struct utsname 结构体类型对象
-
返回值:成功返回 0;失败将返回-1,并设置 errno
-
-
用法
-
先定义一个 struct utsname 结构体变量,调用 uname()函数时传入变量的地址即可
-
struct utsname {
char sysname[]; /* 当前操作系统的名称 /
char nodename[]; / 网络上的名称(主机名) /
char release[]; / 操作系统内核版本 */
char version[]; /* 操作系统发行版本 /
char machine[]; / 硬件架构类型 /
#ifdef _GNU_SOURCE
char domainname[]; / 当前域名 */
#endif
};- 结构体中的所有成员变量都是字符数组,所以获取到的信息都是字符串
-
sysinfo
-
系统调用可用于获取一些系统统计信息
-
#include <sys/sysinfo.h>
int sysinfo(struct sysinfo *info);-
info:struct sysinfo 结构体类型指针,指向一个 struct sysinfo 结构体类型对象
-
返回值:成功返回 0;失败将返回-1,并设置 errno
-
-
用法
-
先定义一个 struct sysinfo 结构体变量,调用 sysinfo()函数时传入变量的地址即可
-
struct sysinfo {
long uptime; /* 自系统启动之后所经过的时间(以秒为单位) /
unsigned long loads[3]; / 1, 5, and 15 minute load averages /
unsigned long totalram; / 总的可用内存大小 /
unsigned long freeram; / 还未被使用的内存大小 /
unsigned long sharedram; / Amount of shared memory /
unsigned long bufferram; / Memory used by buffers /
unsigned long totalswap; / Total swap space size /
unsigned long freeswap; / swap space still available /
unsigned short procs; / 系统当前进程数量 /
unsigned long totalhigh; / Total high memory size /
unsigned long freehigh; / Available high memory size /
unsigned int mem_unit; / 内存单元大小(以字节为单位) /
char _f[20-2sizeof(long)-sizeof(int)]; /* Padding to 64 bytes */
};
-
gethostname
-
单独获取 Linux 系统主机名,与 struct utsname 数据结构体中的 nodename 变量一样
-
#include <unistd.h>
int gethostname(char *name, size_t len);-
name:指向用于存放主机名字符串的缓冲区
-
en:缓冲区长度
-
返回值:成功返回 0,;失败将返回-1,并会设置 errno
-
sysconf
-
是一个库函数,可在运行时获取系统的一些配置信息,譬如页大小(page size)、主机名的最大长度、进程可以打开的最大文件数、每个用户 ID 的最大并发进程数等
-
#include <unistd.h>
long sysconf(int name);-
name:指定了要获取哪个配置信息,参数 name 可取以下任何一个值(都是宏定义,可通过 man 手册查询)
- ⚫ _SC_ARG_MAX:exec 族函数的参数的最大长度。
⚫ _SC_CHILD_MAX:每个用户的最大并发进程数,也就是同一个用户可以同时运行的最大进程数。
⚫ _SC_HOST_NAME_MAX:主机名的最大长度。
⚫ _SC_LOGIN_NAME_MAX:登录名的最大长度。
⚫ _SC_CLK_TCK:每秒时钟滴答数,也就是系统节拍率。
⚫ _SC_OPEN_MAX:一个进程可以打开的最大文件数。
⚫ _SC_PAGESIZE:系统页大小(page size)。
⚫ _SC_TTY_NAME_MAX:终端设备名称的最大长度。
……
- ⚫ _SC_ARG_MAX:exec 族函数的参数的最大长度。
-
返回值:若指定的参数 name 为无效值,则 sysconf()函数返回-1,并会将 errno 设置为 EINVAL。否则返回的值便是对应的配置值。
- 注意,返回值是一个 long 类型的数据。
-
二、时间与日期
时间相关的概念
-
GMT 时间
- GMT,即格林威治标准时间,是在1884年由国际大会确立的全球时间中心点,以英国伦敦格林威治皇家天文台为基准。GMT代表零时区的时间,与北京时间(东八区)相差8小时。例如,GMT 12:00对应北京时间是20:00。
-
UTC 时间
- UTC,即世界协调时间,是一个基于国际原子时和地球自转修正计算出的非常精确的时间标准。虽然UTC和GMT都代表国际标准时间,但UTC在精确度上更为严格。在日常使用和编程中,通常不需要区分这两者的微小差异。在Ubuntu系统中,可以用
date -u
命令查看当前的UTC时间。
- UTC,即世界协调时间,是一个基于国际原子时和地球自转修正计算出的非常精确的时间标准。虽然UTC和GMT都代表国际标准时间,但UTC在精确度上更为严格。在日常使用和编程中,通常不需要区分这两者的微小差异。在Ubuntu系统中,可以用
-
时区配置文件
-
在Ubuntu系统中,时区信息被保存在
/usr/share/zoneinfo
目录下的标准格式文件中,这些文件包括特定国家或地区的时区信息,通常以城市或地区的缩写来命名,如EST(美国东部标准时间)、CET(欧洲中部
时间)、UTC(世界标准时间)等,这些文件被称为时区配置文件。 -
系统的本地时间由时区配置文件/etc/localtime 定义,通常链接到/usr/share/zoneinfo 目录下的某一个文件(或其子目录下的某一个文件)
-
如果我们要修改 Ubuntu 系统本地时间的时区信息,可以直接将/etc/localtime 链到/usr/share/zoneinfo 目录下的任意一个时区配置文件,譬如 EST(美国东部标准时间),首先进入到/etc 目录下,执行下面的命令:
- sudo rm -rf localtime
#删除原有链接文件
sudo ln -s /usr/share/zoneinfo/EST localtime #重新建立链接文件
- sudo rm -rf localtime
-
Linux系统中的时间
-
点时间和段时间
-
点时间指的是具体的单一时间点,例如“2021年2月22日星期一11:12分35秒”
-
段时间则指的是一个时间范围,例如“早上8:00到中午12:00”
-
-
实时时钟 RTC
-
操作系统通常包含两个时钟:系统时钟和实时时钟(RTC)
-
系统时钟由内核在系统启动后维护,如使用date命令查看的时间,它在系统关机时不存在
-
实时时钟由RTC芯片提供,该芯片由电池供电,确保即使在系统关机时也能持续计时
-
-
Linux 系统如何记录时间
- 在Linux系统启动时,首先从RTC硬件读取实时时钟值来初始化系统时钟,之后内核将维护自己的系统钟。RTC硬件在启动时只被读取一次用于初始化。在系统关机时,内核会将当前的系统时钟时间写回RTC硬件以进行同步。
-
jiffies 的引入
- jiffies是Linux内核中的一个全局变量,用于记录系统自启动以来的节拍数。内核在编译时定义了节拍率(如100Hz、200Hz等),节拍率越低,每个节拍的时间越短,jiffies的时间精度越高,但也会增加系统负担,一般默认情况下都是采用 100Hz 作为系统节拍率。系统启动时,RTC硬件的实时时钟被读取用于初始化jiffies。内核通过jiffies维护系统时钟,而系统调用如time()和gettimeofday()则通过jiffies计算当前时间。
获取时间
-
time 函数
-
获取当前时间,以秒为单位,返回得到的值是自 1970-01-01 00:00:00 +0000 (UTC)
以来的秒数 -
#include <time.h>
time_t time(time_t *tloc);-
tloc:如果 tloc 参数不是 NULL,则返回值也存储在 tloc 指向的内存中
-
返回值:成功则返回自 1970-01-01 00:00:00 +0000 (UTC)以来的时间值(以秒为单位);失败则返回-1,
并会设置 errno
-
-
time 函数获取得到的是一个时间段,也就是从 1970-01-01 00:00:00 +0000 (UTC)到现在这段时间所经过的秒数
-
自 1970-01-01 00:00:00 +0000 (UTC)以来经过的总秒数,我们把这个称之为日历时间或 time_t 时间
-
-
gettimeofday 函数
-
系统调用 gettimeofday()函数提供微秒级时间精度
-
#include <sys/time.h>
int gettimeofday(struct timeval *tv, struct timezone *tz);-
tv:参数 tv 是一个 struct timeval 结构体指针变量
- struct timeval {
long tv_sec; /* 秒 /
long tv_usec; / 微秒 */
};
- struct timeval {
-
tz:参数 tz 是个历史产物,早期实现用其来获取系统的时区信息,目前已遭废弃,在调用gettimeofday()
函数时应将参数 tz 设置为 NULL -
返回值:成功返回 0;失败将返回-1,并设置 errno
-
-
gettimeofday()函数将当前时间存储在struct timeval结构体中,该结构体包含tv_sec(秒)和tv_usec(微秒)两个成员。返回的时间是这两个值的组合,表示自1970年1月1日UTC以来的秒数和微秒数。time()函数返回的秒数与gettimeofday()返回的tv_sec字段相同,都是自同一基准时间以来的秒数
-
时间转换
-
ctime 函数
-
C 库函数,可以将日历时间转换为可打印输出的字符串形式
-
#include <time.h>
char *ctime(const time_t *timep);
char *ctime_r(const time_t *timep, char *buf);-
imep:time_t 时间变量指针
-
返回值:成功将返回一个 char *类型指针,指向转换后得到的字符串;失败将返回 NULL
-
-
使用ctime函数可以简单地将time_t类型的时间变量转换为字符串形式,只需传入指向该时间变量的指针即可。调用成功后,它返回一个指向结果字符串的指针,这个字符串可以用printf打印。然而,ctime函数是不可重入的,可能存在安全问题。因此,推荐使用其可重入版本ctime_r(), 它需要额外一个缓冲区参数来存放结果字符串。ctime_r()更安全,适合多线程环境。需要注意的是,ctime和ctime_r转换的时间是本地时间而非UTC时间
-
-
localtime 函数
-
可以把 time()或 gettimeofday()得到的秒数(time_t 时间或日历时间)变成一个 struct tm 结构体所表示的时间,该时间对应的是本地时间
-
#include <time.h>
struct tm *localtime(const time_t *timep);
struct tm *localtime_r(const time_t *timep, struct tm *result);-
timep:需要进行转换的 time_t 时间变量对应的指针,可通过 time()或 gettimeofday()获取得到
-
result:是一个 struct tm 结构体类型指针
-
返回值:对于不可重入版本 localtime()来说,成功则返回一个有效的 struct tm 结构体指针,而对于可重
入版本 localtime_r()来说,成功执行情况下,返回值将会等于参数 result;失败则返回 NULL -
localtime()函数直接返回一个指向struct tm结构体的指针,无需调用者提供该结构体,使用起来很方便,但存在安全风险,因此不推荐使用。而localtime_r()是可重入版本,需要调用者提供一个struct tm结构体变量,并将其指针作为参数传入,函数内部会对该结构体进行赋值,更安全可靠
- 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, 星期日 Sunday = 0、星期一=1…) /
int tm_yday; / 一年里的第几天(0-365, 1 Jan = 0) /
int tm_isdst; / 夏令时 */
};
- struct tm {
-
-
-
gmtime 函数
-
把 time_t 时间变成一个 struct tm 结构体所表示的时间,与 localtime()所不同的是,gmtime()函数所得到的是 UTC 国际标准时间,并不是计算机的本地时间,这是它们之间的唯一区别
-
#include <time.h>
struct tm *gmtime(const time_t *timep);
struct tm *gmtime_r(const time_t *timep, struct tm *result);-
timep:需要进行转换的 time_t 时间变量对应的指针,可通过 time()或 gettimeofday()获取得到
-
result:是一个 struct tm 结构体类型指针
- 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, 星期日 Sunday = 0、星期一=1…) /
int tm_yday; / 一年里的第几天(0-365, 1 Jan = 0) /
int tm_isdst; / 夏令时 */
};
- struct tm {
-
返回值:对于不可重入版本 localtime()来说,成功则返回一个有效的 struct tm 结构体指针,而对于可重
入版本 localtime_r()来说,成功执行情况下,返回值将会等于参数 result;失败则返回 NULL
-
-
-
mktime 函数
-
C 库函数,mktime()函数与 localtime()函数相反,mktime()可以将使用 struct tm 结构体表示的分解时间转换为 time_t
时间(日历时间) -
#include <time.h>
time_t mktime(struct tm *tm);-
m:需要进行转换的 struct tm 结构体变量对应的指针
-
返回值:成功返回转换得到 time_t 时间值;失败返回-1
-
-
-
asctime 函数
-
asctime()函数与 ctime()函数的作用一样,也可将时间转换为可打印输出的字符串形式,与 ctime()函数
的区别在于,ctime()是将 time_t 时间转换为固定格式字符串、而 asctime()则是将 struct tm 表示的分解时间转换为固定格式的字符串 -
#include <time.h>
char *asctime(const struct tm *tm);
char *asctime_r(const struct tm *tm, char *buf);-
tm:需要进行转换的 struct tm 表示的时间
-
buf:可重入版本函数 asctime_r 需要额外提供的参数 buf,指向一个缓冲区,用于存放转换得到的字符串
-
返回值:转换失败将返回 NULL;成功将返回一个 char *类型指针,指向转换后得到的时间字符串,对
于 asctime_r 函数来说,返回值就等于参数 buf
-
-
-
strftime 函数
-
strftime)函数可以将struct tm结构体表示的时间转换为格式化字符串,功能比asctime()和ctime()更强大,允许用户自定义时间显示格式,而asctime()和ctime()转换的时间字符串格式是固定的。
-
#include <time.h>
size_t strftime(char *s, size_t max, const char *format, const struct tm *tm);-
s:指向一个缓存区的指针,该缓冲区用于存放生成的字符串
-
max:字符串的最大字节数
-
format:这是一个用字符串表示的字段,包含了普通字符和特殊格式说明符,可以是这两种字符的任意
组合。特殊格式说明符将会被替换为 struct tm 结构体对象所指时间的相应值-
譬如我要想输出"2021-01-14 16:30:25 January Thursday"这样一种形式表示的时间日期,那么就可以这样来设置 format 参数:
- “%Y-%m-%d %H:%M:%S<%p> %B %A”
-
-
tm:指向 struct tm 结构体对象的指针
-
返回值:如果转换得到的目标字符串不超过最大字节数(也就是 max),则返回放置到 s 数组中的字节数;如果超过了最大字节数,则返回 0
-
-
设置时间
-
settimeofday()函数可以设置系统的本地时间
-
#include <sys/time.h>
int settimeofday(const struct timeval *tv, const struct timezone *tz);-
tv:参数 tv 是一个 struct timeval 结构体指针变量
-
tz:参数 tz 是个历史产物,早期实现用其来设置系统的时区信息,目前已遭废弃,在调用 settimeofday()函数时应将参数 tz 设置为 NULL
-
返回值:成功返回 0;失败将返回-1,并设置 errno
-
-
使用 settimeofday 设置系统时间时内核会进行权限检查,只有超级用户(root)才可以设置系统时间,普通用户将无操作权限
三、进程时间
进程时间的概念
- 进程时间是指进程创建后到现在为止所使用的CPU资源总时间,分为用户CPU时间(进程在用户态使用的CPU时间)和系统CPU时间(进程在内核态使用的CPU时间)。进程时间是用户CPU时间和系统CPU时间的总和,但不包括进程休眠时未使用CPU资源的时间。
times函数
-
获取当前进程时间
-
#include <sys/times.h>
clock_t times(struct tms *buf);-
buf:times()会将当前进程时间信息存在一个 struct tms 结构体数据中,所以我们需要提供 struct tms 变量,使用参数 buf 指向该变量
- struct tms {
clock_t tms_utime; /* user time, 进程的用户 CPU 时间, tms_utime 个系统节拍数 /
clock_t tms_stime; / system time, 进程的系统 CPU 时间, tms_stime 个系统节拍数 /
clock_t tms_cutime; / user time of children, 已死掉子进程的 tms_utime + tms_cutime 时间总和 /
clock_t tms_cstime; / system time of children, 已死掉子进程的 tms_stime + tms_cstime 时间总和 */
};
- struct tms {
-
返回值:返回类型为clock_t(即long),成功时返回从过去某个时间点到现在的系统节拍数,通过除以节拍率可得到秒数,返回值可能溢出;失败时返回-1并设置errno
-
-
时间总和是从起点到终点的总时间,包括进程休眠状态的时间,因此通常比进程时间多出进程休眠的时间。
clock函数
-
库函数 clock()提供了一个更为简单的方式用于进程时间,它的返回值描述了进程使用的总的 CPU 时间(也就是进程时间,包括用户 CPU 时间和系统 CPU 时间)
-
#include <time.h>
clock_t clock(void);- 函数返回类型为clock_t,表示程序到目前为止的进程时间,不是系统节拍数,需除以CLOCKS_PER_SEC获取秒数。若进程时间不可用或无法表示,则返回-1。
-
能获取到单独的用户 CPU 时间和系统 CPU 时
间
四、生成随机数
随机数与伪随机数
- 在编程中无法获得真正的随机数列,只能通过算法生成伪随机数序列,所以通常所指的随机数实际上是伪随机数。
生成随机数:rand和srand
-
rand()函数
-
用于获取随机数,多次调用 rand()可得到一组随机数序列
-
#include <stdlib.h>
int rand(void);- 返回值:返回一个介于 0 到 RAND_MAX(包含)之间的值,也就是数学上的[0, RAND_MAX]
-
调用rand()函数可生成一定范围内的伪随机数序列,但不设置随机种子将导致每次程序运行生成相同序列。使用srand()设置不同的随机种子可确保每次程序运行时生成不同的随机数序列。
-
-
srand 函数
-
使用 srand()函数为 rand()设置随机数种子
-
#include <stdlib.h>
void srand(unsigned int seed);- seed:用于生成随机数序列的初始值,通常使用当前时间(例如time(NULL))作为种子值,以确保每次启动程序时生成的随机数序列都是不同的
-
产生随机数的 API 函数还有 random()、srandom()、initstate()、setstate()等
五、休眠
休眠的概念
-
有时需要将进程暂停或休眠一段时间,进入休眠状态之后,程序将暂停运行,直到休眠结束。在编程中,sleep()、usleep()和nanosleep()等函数用于使进程暂停执行一段时间,从而实现延时效果。
-
在应用程序中,sleep()等函数用于实现延时,使进程暂停并交出CPU使用权,直到延时结束。这与裸机程序中使用循环执行空指令(nop)来延时不同,后者在延时期间CPU仍在工作。使用sleep()时,进程会退出系统调度队列,直到休眠时间结束才重新参与调度。
秒级休眠:sleep
-
C 库函数,让程序
“休息”一会,然后再继续工作 -
可以被其它信号所打断
-
#include <unistd.h>
unsigned int sleep(unsigned int seconds);-
seconds:休眠时长,以秒为单位
-
返回值:如果休眠时长为参数 seconds 所指定的秒数,则返回 0;若被信号中断则返回剩余的秒数
-
微秒级休眠:usleep
-
C 库函数,与 sleep()的区别在于休眠时长精度不同
-
#include <unistd.h>
int usleep(useconds_t usec);-
usec:休眠时长,以微秒为单位
-
返回值:成功返回 0;失败返回-1,并设置 errno
-
纳秒级休眠:nanosleep
-
系统调用,nanosleep()具有更高精度来设置休眠时间长度,支持纳秒级时长设置
-
可以被其它信号所打断
-
#include <time.h>
int nanosleep(const struct timespec *req, struct timespec *rem);-
req:一个 struct timespec 结构体指针,指向一个 struct timespec 变量,用于设置休眠时间长度,可精确到纳秒级别
-
rem:也是一个 struct timespec 结构体指针,指向一个 struct timespec 变量,也可设置 NULL
-
返回值:成功时返回0,若被信号中断或出错则返回-1,并将剩余休眠时间记录在rem参数中(如果非空),同时设置errno以指示错误类型
-
六、使用堆内存
malloc和free
-
malloc()函数
-
为程序分配一段堆内存
-
#include <stdlib.h>
void *malloc(size_t size);-
size:需要分配的内存大小,以字节为单位
-
返回值:返回值为 void *类型,申请内存成功时返回一个指向分配内存的 void * 类型指针,表示返回的指针类型未知,需要类型转换以便使用。若内存分配失败或参数 size 为 0,返回值将是 NULL
-
-
malloc()函数在堆区分配一段未初始化的内存空间,因此分配后的内存值是不确定的,需要手动初始化
-
在堆上分配的内存,需要手动释放掉
-
-
free()函数
-
为程序释放这段内存
-
#include <stdlib.h>
void free(void *ptr);- ptr:指向需要被释放的堆内存对应的指针
-
-
在Linux系统中,进程终止时,内核会自动关闭未关闭的文件并释放所有占用的内存,包括由malloc()分配的堆内存。这种自动释放机制使得程序员有时会省略对free()函数的调用,以避免复杂的代码和CPU时间的消耗。然而,显式调用free()释放不再需要的内存有助于提高程序的可读性、可维护性,并防止内存泄漏,即不必要的内存占用。
calloc
-
动态地分配 nmemb 个长度为 size 的连续空间,并将每一个字节都初始化为 0
-
#include <stdlib.h>
void *calloc(size_t nmemb, size_t size);-
nmemb:个数
-
size:长度
-
返回值:分配成功返回指向该内存的地址,失败则返回 NULL
-
-
calloc()在动态分配完内存后,自动初始化该内存空间为零,而malloc()不初始化,里边数据是未知的垃圾数据
分配对齐内存:posix_memalign、aligned_alloc、memalign、valloc等
-
malloc()和calloc()函数分配的内存是对齐的,但对齐的字节边界较小,32位系统通常是8字节,64位系统是16字节。若需要更大字节对齐,必须使用其他特定函数。
-
posix_memalign()函数
-
分配对齐的内存空间,其地址是参数alignment的整数倍,alignment必须是2的幂次方且是sizeof(void *)的整数倍。在32位系统中,sizeof(void *)为4,在64位系统中为8
-
#include <stdlib.h>
int posix_memalign(void **memptr, size_t alignment, size_t size);-
memptr:void **类型的指针,内存申请成功后会将分配的内存地址存放在*memptr 中
-
alignment:设置内存对其的字节数,alignment 必须是 2 的幂次方(譬如 24、25、2^8 等),同时也
要是 sizeof(void *)的整数倍 -
size:设置分配的内存大小,以字节为单位,如果参数 size 等于 0,那么*memptr 中的值是 NULL
-
返回值:成功将返回 0;失败返回非 0 值
-
-
-
aligned_alloc()函数
-
用于分配 size 个字节大小的内存空间,返回指向该空间的指针
-
#include <stdlib.h>
void *aligned_alloc(size_t alignment, size_t size);-
alignment:用于设置对齐字节大小,alignment 必须是 2 的幂次方(譬如 24、25、2^8 等)
-
size:设置分配的内存大小,以字节为单位。参数 size 必须是参数 alignment 的整数倍
-
返回值:成功将返回内存空间的指针,内存空间的起始地址是参数 alignment 的整数倍;失败返回 NULL
-
-
-
valloc()函数
-
注意:valloc()函数已经过时了,并不提倡使用
-
分配 size 个 字节大小的 内存空 间 , 返 回 指 向 该 内存空 间 的 指 针 , 内存空 间 的 地 址 是 页 大 小(pagesize)的倍数
-
valloc()与 memalign()类似,只不过 valloc()函数内部实现中,使用了页大小作为对齐的长度,在程序当
中,可以通过系统调用 getpagesize()来获取内存的页大小 -
#include <stdlib.h>
void *valloc(size_t size);
-
-
memalign()函数
-
注意:memalign()函数已经不推荐使用了。
-
memalign()和aligned_alloc()都用于分配对齐的内存,不同之处在于aligned_alloc()要求分配的内存大小必须是对齐值的整数倍,而memalign()没有这个要求。
-
#include <malloc.h>
void *memalign(size_t alignment, size_t size);
-
七、proc 文件系统
简介
-
proc文件系统是一个提供应用层访问内核数据接口的虚拟文件系统。它允许用户和程序获取系统和进程信息,并通过读写操作与内核通信。与实体文件不同,proc文件系统中的文件是动态生成的,只存在于内存中,并不存储在磁盘上。最初,proc文件系统被设计来提供进程信息,但后来扩展到报告更多内核信息和允许动态配置。这个文件系统通常挂载在/proc目录下,为内核开发者提供了一种通过查看特定文件来调试内核和评估新功能影响的方法。
-
/proc 目录下中包含了一些目录和虚拟文件
-
譬如 100038、2299、98560,这些数字对应的其实就是一个一个的进程 PID 号,记录了这些进程相关的信息
-
⚫ cmdline:内核启动参数;
⚫ cpuinfo:CPU 相关信息;
⚫ iomem:IO 设备的内存使用情况;
⚫ interrupts:显示被占用的中断号和占用者相关的信息;
⚫ ioports:IO 端口的使用情况;
⚫ kcore:系统物理内存映像,不可读取;
⚫ loadavg:系统平均负载;
⚫ meminfo:物理内存和交换分区使用情况;
⚫ modules:加载的模块列表;
⚫ mounts:挂载的文件系统列表;
⚫ partitions:系统识别的分区表;
⚫ swaps:交换分区的利用情况;
⚫ version:内核版本信息;
⚫ uptime:系统运行时间;
-
proc 文件系统的使用
-
读取/proc 目录下的这些文件,获取文件中记录的信息
-
使用 cat 命令读取
- 直接使用 cat 命令读取
-
使用 read()函数读取
- 在应用程序中调用 open()打开、然后再使read()函数读取