嵌入式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;公司开始转向第三方来提高其提供关…

解析XML文件的几种方法

解析XML文件的几种方法 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨在Java中解析XML文件的几种常用方法。XML&#xff08;可扩展标记语言…

《每天5分钟用Flask搭建一个管理系统》 第6章:数据库集成

第6章&#xff1a;数据库集成 6.1 数据库的选择和配置 在Flask中集成数据库&#xff0c;首先需要选择一个数据库系统。常见的选择包括SQLite、MySQL、PostgreSQL等。选择后&#xff0c;需要配置数据库连接字符串。 示例代码&#xff1a;配置数据库 from flask import Flask…

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

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

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

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

使用JavaScript的indexOf方法

使用JavaScript的indexOf方法 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来探讨JavaScript中的indexOf方法。indexOf方法是JavaScript中一个非常实…

【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…

Socket编程详解(二)核心代码讲解

本文对代码的讲解基于上一篇博客 快速链接 Socket编程详解&#xff08;一&#xff09;服务端与客户端的双向对话 小试牛刀1&#xff1a;委托声明的关键字和委托方法使用的方法名是不一样的名称 可读性&#xff1a;有时&#xff0c;委托的名称可能描述了它的用途或它在哪里被…

使用Swoole开发高性能的Web爬虫

使用swoole开发高性能的web爬虫 Web爬虫是一种自动化获取网络数据的工具&#xff0c;它可以在互联网上收集数据&#xff0c;并且可以被应用于各种不同的领域&#xff0c;如搜索引擎、数据分析、竞争对手分析等。随着互联网规模和数据量的快速增长&#xff0c;如何开发一个高性…

RequestMappingHandlerAdapter【Spring源码学习】

HandlerAdapter处理器适配器就是去调用处理器方法&#xff01; HandlerAdapter // 解析RequestMapping注解 生成路径和控制器方法得映射关系 RequestMappingHandlerMapping requestMappingHandlerMapping context.getBean(RequestMappingHandlerMapping.class);// 查看生成的…

六、常用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")】…

「树莓派入门」树莓派基础06-Linux操作系统和编辑器的使用

本文主要介绍如何在树莓派上使用终端进行基本操作&#xff0c;包括文件的创建、查看、删除和移动&#xff0c;以及如何使用超级用户权限和切换用户。同时&#xff0c;也介绍了如何使用nano和vi编辑器编辑文件。 一、连接树莓派 通过SSH连接 确保树莓派的SSH服务已启动。在终端…

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;为学校档案资源的收集、整理、存储、检索与利用开辟了全新的途径。这一系统全面覆盖学生、教职工、教学科研及行政…

驾驭Scala的网络之力:HTTP客户端与服务器实战指南

驾驭Scala的网络之力&#xff1a;HTTP客户端与服务器实战指南 在现代应用开发中&#xff0c;HTTP作为网络通信的基石&#xff0c;其重要性不言而喻。Scala&#xff0c;以其强大的函数式编程特性和类型系统&#xff0c;为构建高效、可靠的HTTP客户端和服务器提供了丰富的工具和…

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 () {//在时间内重复调用的时候需要清空之前…