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

news2024/9/19 10:39:31

目录

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1878214.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++进阶

C进阶 一、细节1.cout与输出缓冲区2.constexpr3.NULL和nullptr是不同的类型4.关于inline5.函数杂合用法6.const char*、char const*、char * const7.进程地址空间&#xff0c;所谓静态区常量区不准8.位运算9.多态9.1 内存切片9.2 转型9.3 构造函数和析构函数里是静态绑定9.4 dy…

石家庄高校大学智能制造实验室数字孪生可视化系统平台项目验收

智能制造作为未来制造业的发展方向&#xff0c;已成为各国竞相发展的重点领域。石家庄高校大学智能制造实验室积极响应国家发展战略&#xff0c;结合自身优势&#xff0c;决定引进数字孪生技术&#xff0c;构建一个集教学、科研、生产于一体的可视化系统平台。 数字孪生可视化…

隐藏Python运行产生的缓存文件(__pycache__)

不少同学使用VScode 提交或运行python代码的时候&#xff0c;出现一些缓存文件 类似于(__pycache__) 这种&#xff0c;对于我这种有一丢丢强迫症的人来说&#xff0c;运行一次就得删除一次&#xff0c;那有没有什么办法将其隐藏的&#xff1f; 在vscode编辑器中打开设置&#…

用易查分制作《假期安全承诺书》支持在线手写签名,一键导出打印

暑假将至&#xff0c;学校通常会下发假期安全承诺书让家长签署。 易查分可以实现网上下发安全承诺书通知&#xff0c;让学生家长进行签名确认&#xff0c;还可以导出PDF文件&#xff0c;方便打印一人一张的纸质版承诺书&#xff0c;下面就来教给大家如何使用吧&#xff01; 暑假…

搭建大型分布式服务(四十一)SpringBoot 整合多个kafka数据源-支持亿级消息生产者

系列文章目录 文章目录 系列文章目录前言一、本文要点二、开发环境三、原项目四、修改项目五、测试一下五、小结 前言 本插件稳定运行上百个kafka项目&#xff0c;每天处理上亿级的数据的精简小插件&#xff0c;快速上手。 <dependency><groupId>io.github.vipjo…

electron线上更新

一、安装electron-updater npm install --save electron-updater二、在main.js中引入使用 import { autoUpdater } from electron; if (!isDev) {const serverUrl https://your-update-server.com; // 自定义更新服务器地址或GitHub Releases地址autoUpdater.setFeedURL(${…

新奥集团校招面试经验分享、测评笔试题型分析

一、走进新奥集团 新奥集团成立于1989年&#xff0c;总部位于河北廊坊&#xff0c;是中国领先的清洁能源企业集团。业务涵盖城市燃气、能源化工、环保科技等多个领域&#xff0c;致力于构建现代能源体系&#xff0c;提升生活品质。 二、新奥集团校招面试经验分享 新奥集团的…

力扣第一道困难题《3. 无重复字符的最长子串》,c++

目录 方法一&#xff1a; 方法二&#xff1a; 方法三&#xff1a; 方法四&#xff1a; 没有讲解&#xff0c;但给出了优秀题解 本题链接&#xff1a;4. 寻找两个正序数组的中位数 - 力扣&#xff08;LeetCode&#xff09; 话不多说&#xff0c;我们直接开始进行本题的思路解…

Facebook的投流技巧有哪些?

相信大家都知道Facebook拥有着巨大的用户群体和高转化率&#xff0c;在国外社交推广中的影响不言而喻。但随着Facebook广告的竞争越来越激烈&#xff0c;在Facebook广告上获得高投资回报率也变得越来越困难。IPIDEA代理IP今天就教大家如何在Facebook上投放广告的技巧&#xff0…

使用stat()函数的例子

代码&#xff1a; #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <stdio.h>int main(void) {struct stat st;if(-1stat("test.txt",&st)){printf("获得文件状态失败\n");return -1;}printf(&q…

14 卡尔曼滤波及代码实现

文章目录 14 卡尔曼滤波及代码实现14.0 基本概念14.1 公式推导14.2 代码实现 14 卡尔曼滤波及代码实现 14.0 基本概念 卡尔曼滤波是一种利用线性系统状态方程&#xff0c;通过系统输入输出观测数据&#xff0c;对系统状态进行最优估计的算法。由于观测数据包括系统中的噪声和…

系统总结:AI产品经理知识体系

算法demo更偏向于命题作文&#xff0c;而在产品商业化的时候&#xff0c;关键的第一步就在于基于场景&#xff0c;去重新定义问题&#xff01; 近两年人工智能行业在国内外得到了爆发试的增长&#xff0c;各大巨头纷纷布局成立了自己的人工智能实验室和研究院&#xff0c;但是我…

已解决问题 | 该扩展程序未列在 Chrome 网上应用店中,并可能是在您不知情的情况下添加的

在Chrome浏览器中&#xff0c;如果你看到“该扩展程序未列在 Chrome 网上应用店中&#xff0c;并可能是在您不知情的情况下添加的”这样的提示&#xff0c;通常是因为该扩展程序没有通过Chrome网上应用店进行安装。以下是解决这个问题的步骤&#xff1a; 解决办法&#xff1a;…

携程二面测开—中核

4.12 35min面试经验 自我介绍 在面试的开始&#xff0c;我简洁明了地进行了自我介绍&#xff0c;突出了我的教育背景、技能特长以及实习经历&#xff0c;为后续的面试内容打下了良好的基础。 实习的具体工作内容 在谈及实习经历时&#xff0c;我详细阐述了在实习期间所承担…

Sparse4D v1

Sparse4D: Multi-view 3D Object Detection with Sparse Spatial-Temporal Fusion 单位&#xff1a;地平线 GitHub&#xff1a;https://github.com/HorizonRobotics/Sparse4D 论文&#xff1a;https://arxiv.org/abs/2211.10581 时间&#xff1a;2022-11 找博主项目讨论方…

在Qt中,直接include <moc_xxxxx.cpp> 为什么不会出现符号冲突的错误?

在逛Qt官方社区的时候看到这样一个帖子&#xff1a; https://forum.qt.io/topic/117973/how-does-include-moc_-cpp-work 大概的意思是moc_xxx.cpp如果已经被编译器编译&#xff0c;那么在另一个cpp文件中include同一个moc_xxx.cpp应该出现符号冲突才对&#xff0c;但是Qt却能正…

音频Balance源码总结

音频Balance源码总结 何为音频Balance&#xff1f; 顾名思义&#xff0c;Balance及平衡&#xff0c;平衡也就是涉及多方&#xff0c;音频左右甚至四通道&#xff0c;调节所有通道的音量比&#xff0c;使用户在空间内听到各个通道的音频大小不一&#xff0c;好似置身于真实环境…

高考落幕,暑期西北行,甘肃美食等你来尝

高考结束&#xff0c;暑期来临&#xff0c;西北之旅成为许多人的热门选择。而来到甘肃&#xff0c;除了领略壮丽的自然风光和深厚的历史文化&#xff0c;甘肃特产和传统面点以其独特的风味和传统的制作工艺也为游客们带来了一场地道的甘肃美食体验。 平凉的美食&#x…

成立近30年,它如何找到政企采购突破点?

回看中国采购行业的发展&#xff0c;大致可以被分为四个阶段&#xff1a;上世纪90年代的传统采购时代、本世纪初的ERP采购时代、近10年的SRM采购时代以及2018年以来开启的数字化采购时代。近年来&#xff0c;大数据、人工智能和物联网的高速发展&#xff0c;为采购信息化提供底…

读书笔记-Java并发编程的艺术-第3章(Java内存模型)-第6节(final域的内存语义)

文章目录 3.6 final域的内存语义3.6.1 final 域的重排序规则3.6.2 写final 域的重排序规则3.6.3 读final 域的重排序规则3.6.4 final 域为引用类型3.6.5 为什么 final 引用不能从构造函数内“逸出”3.6.6 final 语义在处理器中的实现3.6.7 JSR-133 为什么要增强final 的语义 3.…