目录
1 uname函数获取内核名称和信息
1.1 Linux系统命令行
1.2 系统调用函数
2 sysinfo 函数
3 gethostname 函数
4 sysconf函数
1 uname函数获取内核名称和信息
1.1 Linux系统命令行
在Linux系统中,uname
命令行工具可以显示关于当前操作系统的信息。这个命令有多种选项可以用来显示不同的系统信息。以下是一些常用的uname
选项:
-a
或--all
:显示所有信息。-s
或--kernel-name
:显示内核名称。-n
或-nodename
:显示网络节点名称(即主机名)。-r
或--release
:显示内核发行版本。-v
或--version
:显示内核版本。-m
或--machine
:显示计算机的硬件架构。-p
或--processor
:显示处理器类型。-i
或--hardware-platform
:显示硬件平台。
例如,如果你想查看所有可用的系统信息,可以在终端中输入以下命令:
uname -a
这将显示类似于以下的输出:
Linux qinlong 5.15.0-113-generic #123~20.04.1-Ubuntu SMP Wed Jun 12 17:33:13 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
这里的输出包括了内核名称、主机名、内核版本、硬件架构等信息。
1.2 系统调用函数
uname
函数在 Linux 系统中是一个系统调用,它用于获取当前操作系统的名称和其他相关信息,通常用于编程中。这个函数的原型定义在 <sys/utsname.h>
头文件中。函数的声明如下:
#include <sys/utsname.h>
int uname(struct utsname *buf);
参数 buf
是一个指向 utsname
结构的指针,该结构定义如下:
struct utsname {
char sysname[]; /* 当前操作系统的名称 */
char nodename[]; /* 网络上的名称(主机名) */
char release[]; /* 操作系统内核版本 */
char version[]; /* 操作系统发行版本 */
char machine[]; /* 硬件架构类型 */
#ifdef _GNU_SOURCE
char domainname[];/* 当前域名 */
#endif
};
uname
函数将系统信息填充到 utsname
结构中,并将这个结构的指针作为参数返回。如果调用成功,它会返回 0;如果调用失败,则返回 -1 并设置 errno
以指示错误。
下面是使用 uname
函数的程序示例,程序调用 uname
系统调用来获取并打印操作系统的相关信息:
#include <sys/utsname.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
struct utsname name; // 定义一个utsname结构体变量来存储系统信息
// 调用uname函数,将utsname结构体的地址传递给它
if (uname(&name) != 0) {
// 如果uname调用失败,打印错误信息
perror("uname");
return 1;
}
// 打印utsname结构体中的各个字段
printf("System name: %s\n", name.sysname);
printf("Node name: %s\n", name.nodename);
printf("Release: %s\n", name.release);
printf("Version: %s\n", name.version);
printf("Machine: %s\n", name.machine);
return 0;
}
运行结果如下:
2 sysinfo 函数
sysinfo
函数是 Linux 系统中的系统调用,提供了一种获取系统信息的方法,比如总内存、空闲内存、缓冲区内存、交换内存等。函数的原型定义在 <sys/sysinfo.h>
头文件中。函数声明如下:
#include <sys/sysinfo.h>
int sysinfo(struct sysinfo *info);
参数 info
是一个指向 sysinfo
结构的指针,该结构定义如下:
struct sysinfo {
long uptime; /* 系统运行时间,自上次重启以来的秒数 */
unsigned long loads[3]; /* 三个不同时间间隔(1分钟,5分钟,15分钟)的系统负载平均值 */
unsigned long totalram; /* 总物理内存,单位为字节 */
unsigned long freeram; /* 可用物理内存,单位为字节 */
unsigned long sharedram; /* 共享内存总量,单位为字节 */
unsigned long bufferram; /* 缓冲内存总量,单位为字节 */
unsigned long totalswap; /* 总交换空间,单位为字节 */
unsigned long freeswap; /* 可用交换空间,单位为字节 */
unsigned short procs; /* 系统中的进程总数 */
unsigned short pad; /* 保留字段 */
unsigned long totalhigh; /* 高内存总量(仅限CONFIG_HIGHMEM配置) */
unsigned long freehigh; /* 可用高内存量(仅限CONFIG_HIGHMEM配置) */
unsigned mem_unit; /* 内存单位大小 */
char __reserved[256]; /* 保留的填充字段 */
};
sysinfo
函数将系统信息填充到 sysinfo
结构中,并将这个结构的指针作为参数返回。如果调用成功,它会返回 0;如果调用失败,则返回 -1 并设置 errno
以指示错误。
下面的示例程序显示了系统的运行时间、系统负载、内存使用情况等信息。
#include <sys/sysinfo.h>
#include <stdio.h>
int main()
{
struct sysinfo info;
// 调用sysinfo函数,将sysinfo结构的地址传递给它
if (sysinfo(&info) != 0) {
// 如果sysinfo调用失败,打印错误信息
perror("sysinfo");
return 1;
}
// 打印sysinfo结构中的各个字段
printf("Uptime: %ld seconds\n", info.uptime);
printf("Loads: %lu, %lu, %lu\n", info.loads[0], info.loads[1], info.loads[2]);
printf("Total RAM: %lu bytes\n", info.totalram);
printf("Free RAM: %lu bytes\n", info.freeram);
printf("Shared RAM: %lu bytes\n", info.sharedram);
printf("Buffer RAM: %lu bytes\n", info.bufferram);
printf("Total swap: %lu bytes\n", info.totalswap);
printf("Free swap: %lu bytes\n", info.freeswap);
printf("Total processes: %u\n", info.procs);
return 0;
}
运行结果如下:
3 gethostname 函数
gethostname
是广泛使用的系统调用,它用于获取当前主机的网络名称,也就是主机名。这个函数的原型定义在 <unistd.h>
头文件中。函数声明如下:
#include <unistd.h>
int gethostname(char *name, size_t length);
name
: 一个字符数组的指针,用来存储主机名。length
:name
数组的大小,以字节为单位。这个值应该足够大,以确保可以存储主机名。
下面是 gethostname
函数的示例:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main()
{
char hostname[256]; // 定义一个足够大的缓冲区来存储主机名
int ret;
// 调用gethostname函数
ret = gethostname(hostname, sizeof(hostname));
if (ret == 0) {
// 成功获取主机名
printf("Hostname: %s\n", hostname);
} else {
// 打印错误信息
perror("gethostname");
}
return 0;
}
运行结果如下:
4 sysconf函数
sysconf
函数也是系统调用,用于查询系统相关的配置参数,如内存页面大小、最大文件大小等。函数的原型定义在 <unistd.h>
头文件中。函数声明如下:
#include <unistd.h>
long sysconf(int name);
参数 name
指定了要查询的系统配置参数的名称。name
可以是以下几个宏之一:
_SC_ARG_MAX
: 最大的命令行参数长度。_SC_CHILD_MAX
: 系统允许的最大子进程数。_SC_CLK_TCK
: 每秒的时钟滴答数(通常等同于CLOCKS_PER_SEC
)。_SC_NGROUPS_MAX
: 一个用户可以拥有的最大补充组数。_SC_OPEN_MAX
: 系统允许的每个进程可同时打开的最大文件数。_SC_STREAM_MAX
: 系统允许的每个进程可同时打开的最大流数。_SC_JOB_CONTROL
: 系统是否支持作业控制。_SC_SAVED_IDS
: 系统是否支持设置用户和组ID。_SC_VERSION
: POSIX 版本号。_SC_PAGESIZE
: 内存页面大小,通常用于内存分配。
如果查询成功,sysconf
将返回所查询配置参数的值;如果失败,将返回 -1 并设置 errno
以指示错误。
下面是 sysconf
函数查询内存页面大小的示例:
#include <stdio.h>
#include <unistd.h>
int main() {
long pagesize = sysconf(_SC_PAGESIZE);
if (pagesize != -1) {
printf("Memory page size: %ld bytes\n", pagesize);
} else {
perror("sysconf failed");
}
return 0;
}
运行结果如下,输出值 "4096" 表示内存页面大小为 4096 字节,即 4 KB。不同的系统可能会有不同的页面大小: