嵌入式Linux系统编程 — 5.1 uname、sysinfo、gethostname、sysconf函数查询系统信息

目录

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: 一个字符数组的指针,用来存储主机名。
  • lengthname 数组的大小,以字节为单位。这个值应该足够大,以确保可以存储主机名。

下面是 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。不同的系统可能会有不同的页面大小:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

几度春风里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值