本文主要是用C语言获取Linux系统信息的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。
点击查看使用工具及版本
Windows windows11 Ubuntu Ubuntu16.04的64位版本 VMware® Workstation 16 Pro 16.2.3 build-19376536 SecureCRT Version 8.7.2 (x64 build 2214) - 正式版-2020年5月14日 开发板 正点原子 i.MX6ULL Linux阿尔法开发板 uboot NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03) linux内核 linux-4.15(NXP官方提供) STM32开发板 正点原子战舰V3(STM32F103ZET6)
点击查看本文参考资料
点击查看相关文件下载
一、系统信息 1. uname() 函数 1.1 函数说明 在linux
下可以使用man 2 uname
命令查看该函数的帮助手册。
1 2 3 4 5 #include <sys/utsname.h> int uname (struct utsname *buf) ;
【函数说明】 该函数是一个系统调用,可以用于获取系统的一些信息。
【函数参数】
buf
:struct utsname
类型结构体指针变量,指向一个存储系统信息的struct utsname
结构体类型对象,该结构体类型的成员都是char
类型的字符串。
点击查看 struct utsname 结构体说明
在使用man
查看帮助手册的时候,有该结构体的原型:
1 2 3 4 5 6 7 8 9 10 11 struct utsname { char sysname[]; char nodename[]; char release[]; char version[]; char machine[]; #ifdef _GNU_SOURCE char domainname[]; #endif };
成员说明如下:
sysname 当前操作系统的名称 nodename 网络上的名称(主机名) release 操作系统内核版本 version 操作系统发行版本 machine 硬件架构类型 domainname 当前域名
【返回值】 int
类型,成功返回0
,失败返回-1
,并设置errno
。
【使用格式】 一般情况下基本使用格式如下:
1 2 3 4 5 6 #include <sys/utsname.h> struct utsname os_info ;uname(&os_info);
【注意事项】 none
1.2 使用实例 点击查看实例
test.c 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #include <stdio.h> #include <sys/utsname.h> int main (int arc, char *argv[]) { struct utsname os_info ; int ret; ret = uname(&os_info); if (ret == -1 ) { perror("uname error" ); return -1 ; } printf ("操作系统名称: %s\n" , os_info.sysname); printf ("主机名: %s\n" , os_info.nodename); printf ("内核版本: %s\n" , os_info.release); printf ("发行版本: %s\n" , os_info.version); printf ("硬件架构: %s\n" , os_info.machine); return 0 ; }
在终端执行以下命令编译程序:
1 2 gcc test.c -Wall # 生成可执行文件 a.out ./a.out # 执行可执行程序
然后,终端会有以下信息显示:
1 2 3 4 5 操作系统名称: Linux 主机名: vm 内核版本: 5.11.0-49-generic 发行版本: #55-Ubuntu SMP Wed Jan 12 17:36:34 UTC 2022 硬件架构: x86_64
2. sysinfo() 函数 2.1 函数说明 在linux
下可以使用man 2 sysinfo
命令查看该函数的帮助手册。
1 2 3 4 5 #include <sys/sysinfo.h> int sysinfo (struct sysinfo *info) ;
【函数说明】 该函数是一个系统调用,可以用于获取系统的一些相关信息。
【函数参数】
info
:struct sysinfo
类型结构体指针变量,指向一个存储系统相关信息的struct sysinfo
结构体类型对象。
点击查看 struct sysinfo结构体说明
在使用man
查看帮助手册的时候,有该结构体的原型:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 struct sysinfo { long uptime; unsigned long loads[3 ]; unsigned long totalram; unsigned long freeram; unsigned long sharedram; unsigned long bufferram; unsigned long totalswap; unsigned long freeswap; unsigned short procs; unsigned long totalhigh; unsigned long freehigh; unsigned int mem_unit; char _f[20 -2 *sizeof (long )-sizeof (int )]; };
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 struct sysinfo { long uptime; unsigned long loads[3 ]; unsigned long totalram; unsigned long freeram; unsigned long sharedram; unsigned long bufferram; unsigned long totalswap; unsigned long freeswap; unsigned short procs; unsigned long totalhigh; unsigned long freehigh; unsigned int mem_unit; char _f[20 -2 *sizeof (long )-sizeof (int )]; };
【返回值】 int
类型,成功返回0
,失败返回-1
,并设置errno
。
【使用格式】 一般情况下基本使用格式如下:
1 2 3 4 5 6 #include <sys/sysinfo.h> struct sysinfo sys_info ;sysinfo(&sys_info);
【注意事项】 none
2.2 使用实例 点击查看实例
test.c 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #include <stdio.h> #include <sys/sysinfo.h> int main (int arc, char *argv[]) { struct sysinfo sys_info ; int ret; ret = sysinfo(&sys_info); if (ret == -1 ) { perror("sysinfo error" ); return -1 ; } printf ("uptime: %ld\n" , sys_info.uptime); printf ("totalram: %lu\n" , sys_info.totalram); printf ("freeram: %lu\n" , sys_info.freeram); printf ("sharedram: %lu\n" , sys_info.sharedram); printf ("bufferram: %lu\n" , sys_info.bufferram); printf ("totalswap: %lu\n" , sys_info.totalswap); printf ("freeswap: %lu\n" , sys_info.freeswap); printf ("procs: %u\n" , sys_info.procs); printf ("totalhigh: %lu\n" , sys_info.totalhigh); printf ("freehigh: %lu\n" , sys_info.freehigh); printf ("mem_unit: %d\n" , sys_info.mem_unit); return 0 ; }
在终端执行以下命令编译程序:
1 2 gcc test.c -Wall # 生成可执行文件 a.out ./a.out # 执行可执行程序
然后,终端会有以下信息显示:
1 2 3 4 5 6 7 8 9 10 11 uptime: 9035 totalram: 4083724288 freeram: 1898512384 sharedram: 38412288 bufferram: 110936064 totalswap: 1218854912 freeswap: 1218854912 procs: 532 totalhigh: 0 freehigh: 0 mem_unit: 1
3. gethostname() 函数 3.1 函数说明 在linux
下可以使用man 2 gethostname
命令查看该函数的帮助手册。
1 2 3 4 5 #include <unistd.h> int gethostname (char *name, size_t len) ;
【函数说明】 该函数是一个系统调用,可以用于获取Linux
系统的主机名称,功能其实与struct utsname
数据结构体中的nodename
成员变量一样。
【函数参数】
name
:char
类型指针变量,指向用于存放主机名字符串的内存缓冲区。
len
:size_t
类型,表示缓冲区的长度。
【返回值】 int
类型,成功返回0
,失败返回-1
,并设置errno
。
【使用格式】 一般情况下基本使用格式如下:
1 2 3 4 5 6 #include <unistd.h> char hostname[20 ];gethostname(hostname, sizeof (hostname));
【注意事项】 none
3.2 使用实例 点击查看实例
test.c 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include <stdio.h> #include <unistd.h> #include <string.h> int main (int arc, char *argv[]) { char hostname[20 ]; int ret; memset (hostname, 0 , sizeof (hostname)); ret = gethostname(hostname, sizeof (hostname)); if (ret == -1 ) { perror("gethostname error" ); return -1 ; } printf ("hostname=%s\n" , hostname); return 0 ; }
在终端执行以下命令编译程序:
1 2 gcc test.c -Wall # 生成可执行文件 a.out ./a.out # 执行可执行程序
然后,终端会有以下信息显示:
4. gethostname() 函数 4.1 函数说明 在linux
下可以使用man 2 gethostname
命令查看该函数的帮助手册。
1 2 3 4 5 #include <unistd.h> int sethostname (const char *name, size_t len) ;
【函数说明】 该函数是一个系统调用,可以用于设置Linux
系统的主机名称。
【函数参数】
name
:char
类型指针变量,指向用于存放要设置的主机名字符串的内存缓冲区。
len
:size_t
类型,表示缓冲区的长度。
【返回值】 int
类型,成功返回0
,失败返回-1
,并设置errno
。
【使用格式】 一般情况下基本使用格式如下:
1 2 3 4 5 6 7 #include <unistd.h> char hostname[20 ];strcpy (hostname, "fanhua" );sethostname(hostname, sizeof (hostname));
【注意事项】 必须在root
用户运行才会生效,否则会提示没有操作权限,并且重启后主机名会恢复原来的名称。
4.2 使用实例 点击查看实例
test.c 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 #include <stdio.h> #include <unistd.h> #include <string.h> int main (int arc, char *argv[]) { char hostname[20 ]; int ret; memset (hostname, 0 , sizeof (hostname)); ret = gethostname(hostname, sizeof (hostname)); if (ret == -1 ) { perror("gethostname error" ); return -1 ; } printf ("hostname=%s\n" , hostname); strcpy (hostname, "fanhua" ); ret = sethostname(hostname, sizeof (hostname)); if (ret == -1 ) { perror("sethostname error" ); return -1 ; } memset (hostname, 0 , sizeof (hostname)); ret = gethostname(hostname, sizeof (hostname)); if (ret == -1 ) { perror("gethostname error" ); return -1 ; } printf ("hostname=%s\n" , hostname); return 0 ; }
在终端执行以下命令编译程序:
1 2 gcc test.c -Wall # 生成可执行文件 a.out ./a.out # 执行可执行程序
然后,终端会有以下信息显示:
1 2 3 4 5 6 hostname=vm hostname=fanhua # 在非 root 下运行的话,会有如下信息 hostname=vm sethostname error: Operation not permitted
5. sysconf() 函数 5.1 函数说明 在linux
下可以使用man 3 sysconf
命令查看该函数的帮助手册。
1 2 3 4 5 #include <unistd.h> long sysconf (int name) ;
【函数说明】 该函数是一个库函数,可在获取系统运行时的一些配置信息。
【函数参数】
name
:int
类型,指定了要获取配置信息的编号。
点击查看 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 终端设备名称的最大长度。
【返回值】 long
类型,若指定的参数name
为无效值,则返回-1
,并会将errno
设置为EINVAL
。如果name
对应一个最大或最小限制,并且该限制是不确定的,则返回-1
并且不更改errno
。否则返回的值便是对应的配置值。
【使用格式】 一般情况下基本使用格式如下:
1 2 3 4 5 #include <unistd.h> sysconf(_SC_TTY_NAME_MAX);
【注意事项】 返回值为long
类型,使用printf
打印时,需要使用%ld
。
5.2 使用实例 点击查看实例
test.c 1 2 3 4 5 6 7 8 9 10 11 12 #include <stdio.h> #include <unistd.h> int main (int arc, char *argv[]) { printf ("每个用户的最大并发进程数: %ld\n" , sysconf(_SC_CHILD_MAX)); printf ("主机名最大长度: %ld\n" , sysconf(_SC_HOST_NAME_MAX)); printf ("系统节拍率: %ld\n" , sysconf(_SC_CLK_TCK)); printf ("系统页大小: %ld\n" , sysconf(_SC_PAGESIZE)); printf ("一个进程可以打开的最大文件数: %ld\n" , sysconf(_SC_OPEN_MAX)); return 0 ; }
在终端执行以下命令编译程序:
1 2 gcc test.c -Wall # 生成可执行文件 a.out ./a.out # 执行可执行程序
然后,终端会有以下信息显示:
1 2 3 4 5 每个用户的最大并发进程数: 15308 主机名最大长度: 64 系统节拍率: 100 系统页大小: 4096 一个进程可以打开的最大文件数: 1024