嵌入式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_SOURCEchar 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.mzph.cn/web/36422.shtml

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

相关文章

你还能顶几天?

A总&#xff1a;你还能顶几天&#xff1f; 汪汪队&#xff1a;顶到奉命撤退的那一天 A总&#xff1a;你在这守散钱点几十年了&#xff0c;从来没跟我提过任何的要求&#xff0c;难道你不困难吗&#xff1f; 汪汪队&#xff1a;有困难&#xff0c;但是我提了有什么用呢&#…

第三方服务提供商的五大风险

亚马逊如何应对网络安全挑战 关键网络安全统计数据和趋势 移动优先世界中安全和隐私策略 当今数字时代网络安全的重要性 用户无法停止犯安全错误的 3 个原因 首席安全官可能过于依赖 EDR/XDR 防御 随着业务流程变得越来越复杂&#xff0c;公司开始转向第三方来提高其提供关…

算法基础--------【图论】

图论&#xff08;待完善&#xff09; DFS:和回溯差不多 BFS:进while进行层序遍历 定义: 图论&#xff08;Graph Theory&#xff09;是研究图及其相关问题的数学理论。图由节点&#xff08;顶点&#xff09;和连接这些节点的边组成。图论的研究范围广泛&#xff0c;涉及路径、…

DNF手游鬼剑士攻略:全面解析流光星陨刀的获取与升级!云手机强力辅助!

《地下城与勇士》&#xff08;DNF&#xff09;手游是一款广受欢迎的多人在线角色扮演游戏&#xff0c;其中鬼剑士作为一个经典职业&#xff0c;因其强大的输出能力和炫酷的技能特效&#xff0c;吸引了众多玩家的青睐。在这篇攻略中&#xff0c;我们将详细介绍鬼剑士的一把重要武…

【Python报错】已解决 ModuleNotFoundError: No module named ‘transformers‘

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 ModuleNotFoundError: No module named ‘transformers’ 是一个常见的错误&#xff0c;它表明你的Python环境中没有安装t…

如何用CSS样式实现一个优雅的渐变效果?

CSS渐变效果 CSS渐变&#xff08;Gradients&#xff09;是一种让两种或多种颜色平滑过渡的视觉效果&#xff0c;广泛应用于网页背景、按钮、边框等&#xff0c;以创造丰富的视觉体验。CSS提供了线性渐变&#xff08;Linear Gradients&#xff09;和径向渐变&#xff08;Radial…

六、常用API ★ ✔

六、常用API 模块14.基础API第一章.String1.String介绍2.String的实现原理 ★private final char[] value;private final byte[] value; 3.String的创建 ★ &#xff08;无参、字符串、字符数组、字节数组&#xff09;4.String 面试题【String s new String("abc")】…

Django —— 用户名和密码配置

创建项目ProjectA&#xff1a; django-admin startproject ProjectA cd进入ProjectA文件夹运行项目&#xff1a; python manage.py runserver 0.0.0.0:8000 Starting development server at http://0.0.0.0:8000/Quit the server with CTRL-BREAK. 访问http://localhost:80…

智慧校园-档案管理系统总体概述

智慧校园档案管理系统&#xff0c;作为教育信息化进程中的重要一环&#xff0c;它运用现代信息技术的力量&#xff0c;彻底改变了传统档案管理的面貌&#xff0c;为学校档案资源的收集、整理、存储、检索与利用开辟了全新的途径。这一系统全面覆盖学生、教职工、教学科研及行政…

2.ROS串口安装和调试

首先安装串口依赖 sudo apt-get install ros-melodic-serial 其次安装串口调试助手 sudo apt-get install minicom 再赋予串口权限 sudo chmod 777 /dev/ttyTHS1 打开调试助手 sudo cutecom 硬件引脚图&#xff1a;

【算法专题--栈】栈的压入、弹出序列 -- 高频面试题(图文详解,小白一看就懂!!)

目录 一、前言 二、题目描述 三、解题方法 &#x1f4a7;栈模拟法&#x1f4a7;-- 双指针 ⭐ 解题思路 ⭐ 案例图解 四、总结与提炼 五、共勉 一、前言 栈的压入、弹出序列 这道题&#xff0c;可以说是--栈专题--&#xff0c;最经典的一道题&#xff0c;也是在…

前端通过ResizeObserver来监听dom大小动态渲染echarts

export const GlobalResizeObserver (function () {const ATTR_NAME global-resizeobserver-keyconst attrValueToCallback {}function antiShake(fn, delay, immediate false) {let timer null//不能用箭头函数return function () {//在时间内重复调用的时候需要清空之前…

Java 实现将List按照字符串(特定规则)排序

日常开发中我们通常会遇到将一个List按照特定的规则排序&#xff0c;例如我们需要将一个List按照 “广州市”, “深圳市”, “珠海市”, “汕头市” 的顺序排序&#xff0c;我们可以使用下述方式实现。 City实体类 import lombok.AllArgsConstructor; import lombok.Data; im…

如何使用飞书快捷指令无感记账,ios版

总结 很多人无法长期坚持记账&#xff0c;主要是每次消费需要打开手机软件&#xff0c;一系列繁琐的操作&#xff0c;导致过程中可能就忘了。 今天给大家带来飞书自动记账。 演示视频 点击查看&#xff1a;https://www.douyin.com/video/7312857946382241063 安装 下载快捷…

hive调优原理详解:案例解析参数配置(第17天)

系列文章目录 一、Hive常问面试函数&#xff08;掌握&#xff09; 二、Hive调优如何配置&#xff08;重点&#xff09; 文章目录 系列文章目录前言一、Hive函数&#xff08;掌握&#xff09;11、JSON数据处理12、炸裂函数13、高频面试题13.1 行转列13.2 列转行 14、开窗函数&a…

mac Canon打印机连接教程

官网下载安装驱动&#xff1a; 选择打印机类型和mac系统型号下载即可 Mac PS 打印机驱动程序 双击安装 系统偏好设置 点击“”添加&#xff1a; OK可打印玩耍&#xff01;&#xff01; 备注&#xff1a; 若需扫描&#xff0c;下载扫描程序&#xff1a; 备注&#xff1a;…

禁止浏览器对input的自动填充和填充提示(适用于谷歌、火狐、Edge(原IE浏览器)等常见浏览器)

目录 1.要解决的问题2.一技能&#xff1a;原生属性&#xff0c;小试牛刀3.二技能&#xff1a;傀儡input&#xff0c;瞒天过海4.三技能&#xff1a;JavaScript出击&#xff0c;直接开大5.九九八十一难&#xff0c;永远还有最后一难 写在前面&#xff1a; 如有转载&#xff0c;务…

ElasticSearch 和 MySQL的区别

MySQLElasticSearch 数据库&#xff08;database&#xff09;索引&#xff08;index&#xff09;数据表&#xff08;table&#xff09; 类型&#xff08;type&#xff09; 记录文档&#xff08;document&#xff0c;json格式&#xff09; 一、ES基础命令 1. ES cat查询命令 2.…

如何用一个二维码实现企业固定资产管理?

固定资产管理中普遍存在盘点难、家底不清、账实不一致、权责不清晰等问题。如果平时不规范化执行&#xff0c;年终面对上上下下、大大小小、成百上千件物资要进行盘点整理的时候&#xff0c;会是十分痛苦且低效的事情。 今天这篇文章就来给大家推荐几家便宜好用的二维码固定资…

动态人物抠图换背景 MediaPipe

pip下载 MediaPipe pip install mediapipe -i 手部特征点模型包包含一个手掌检测模型和一个手部特征点检测模型。手掌检测模型在输入图片中定位手部&#xff0c;手部特征点检测模型可识别手掌检测模型定义的被剪裁手掌图片上的特定手部特征点。 由于运行手掌检测模型非常耗时&…