系统信息:uname,sysinfo,gethostname,sysconf

image

且欲近寻彭泽宰,陶然共醉菊花怀。

文章目录

  • 系统信息
    • 系统标识 uname
    • sysinfo 函数
    • gethostname 函数
    • sysconf()函数

系统信息

系统标识 uname

系统调用 uname()用于获取有关当前操作系统内核的名称和信息,函数原型如下所示(可通过"man 2 uname"命令查看):

#include <sys/utsname.h>
int uname(struct utsname *buf);

使用该函数需要包含头文件<sys/utsname.h>

函数参数和返回值含义如下:

bufstruct utsname 结构体类型指针,指向一个 struct utsname 结构体类型对象。
返回值:成功返回 0;失败将返回-1,并设置 errno

uname()函数用法非常简单,先定义一个 struct utsname 结构体变量,调用 uname()函数时传入变量的地址即可,struct utsname 结构体如下所示:

struct utsname {
     char sysname[]; /* 当前操作系统的名称 */
     char nodename[]; /* 网络上的名称(主机名) */
     char release[]; /* 操作系统内核版本 */
     char version[]; /* 操作系统发行版本 */
     char machine[]; /* 硬件架构类型 */
#ifdef _GNU_SOURCE
     char domainname[];/* 当前域名 */
#endif
};

可以看到,struct utsname 结构体中的所有成员变量都是字符数组,所以获取到的信息都是字符串。

测试
编写一个简单地程序,获取并打印出当前操作系统名称、主机名、内核版本、操作系统发行版本以及处理器硬件架构类型等信息,测试代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/utsname.h>
int main(void)
{
    struct utsname os_info;
    int ret;
    /* 获取信息 */
    ret = uname(&os_info);
    if (-1 == ret) {
        perror("uname error");
        exit(-1);
    }
    /* 打印信息 */
    printf("操作系统名称: %s\n", os_info.sysname);
    printf("主机名: %s\n", os_info.nodename);
    printf("内核版本: %s\n", os_info.release);
    printf("发行版本: %s\n", os_info.version);
    printf("硬件架构: %s\n", os_info.machine);
    exit(0);
}

运行结果:

sundp@sundongpeng:~/workspace/c_program/April$ gcc uname.c
sundp@sundongpeng:~/workspace/c_program/April$ ./a.out
操作系统名称: Linux
主机名: sundongpeng
内核版本: 4.15.0-29-generic
发行版本: #31~16.04.1-Ubuntu SMP Wed Jul 18 08:54:04 UTC 2018
硬件架构: x86_64

sysinfo 函数

sysinfo 系统调用可用于获取一些系统统计信息,其函数原型如下所示:

#include <sys/sysinfo.h>
int sysinfo(struct sysinfo *info);

函数参数和返回值含义如下:

infostruct sysinfo 结构体类型指针,指向一个 struct sysinfo 结构体类型对象。
返回值:成功返回 0;失败将返回-1,并设置 errno

同样 sysinfo()函数用法也非常简单,先定义一个 struct sysinfo 结构体变量,调用 sysinfo()函数时传入变量的地址即可,struct sysinfo 结构体如下所示:

struct sysinfo {
 long uptime; /* 自系统启动之后所经过的时间(以秒为单位) */
 unsigned long loads[3]; /* 1, 5, and 15 minute load averages */
 unsigned long totalram; /* 总的可用内存大小 */
 unsigned long freeram; /* 还未被使用的内存大小 */
 unsigned long sharedram; /* Amount of shared memory */
 unsigned long bufferram; /* Memory used by buffers */
 unsigned long totalswap; /* Total swap space size */
 unsigned long freeswap; /* swap space still available */
 unsigned short procs; /* 系统当前进程数量 */
 unsigned long totalhigh; /* Total high memory size */
 unsigned long freehigh; /* Available high memory size */
 unsigned int mem_unit; /* 内存单元大小(以字节为单位) */
 char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding to 64 bytes */
};

测试

#include <stdio.h>
#include <stdlib.h>
#include <sys/sysinfo.h>

int main(void)
{
    struct sysinfo sys_info;
    int ret;
    /* 获取信息 */
    ret = sysinfo(&sys_info);
    if (-1 == ret) {
        perror("sysinfo error");
        exit(-1);
    }
     /* 打印信息 */
    printf("uptime: %ld\n", sys_info.uptime);
    printf("totalram: %lu\n", sys_info.totalram);
    printf("freeram: %lu\n", sys_info.freeram);
    printf("procs: %u\n", sys_info.procs);
    exit(0);
}

运行结果:

sundp@sundongpeng:~/workspace/c_program/April$ gcc sysinfo.c
sundp@sundongpeng:~/workspace/c_program/April$ ./a.out
操作系统名称: Linux
主机名: sundongpeng
内核版本: 4.15.0-29-generic
发行版本: #31~16.04.1-Ubuntu SMP Wed Jul 18 08:54:04 UTC 2018
硬件架构: x86_64

gethostname 函数

此函数可用于单独获取 Linux 系统主机名,与 struct utsname 数据结构体中的 nodename 变量一样,gethostname 函数原型如下所示(可通过"man 2 gethostname"命令查看):

#include <unistd.h>
int gethostname(char *name, size_t len);

使用此函数需要包含头文件<unistd.h>

函数参数和返回值含义如下:

name:指向用于存放主机名字符串的缓冲区。
len:缓冲区长度。
返回值:成功返回 0,;失败将返回-1,并会设置 errno

测试:
使用 gethostname 函数获取系统主机名:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int main(void)
{
    char hostname[20];
    int ret;
    memset(hostname, 0x0, sizeof(hostname));
    ret = gethostname(hostname, sizeof(hostname));
    if (-1 == ret) {
        perror("gethostname error");
        exit(ret);
    }
    puts(hostname);
    exit(0);
}

运行结果:

sundp@sundongpeng:~/workspace/c_program/April$ gcc gethostname.c
sundp@sundongpeng:~/workspace/c_program/April$ ./a.out
sundongpeng

sysconf()函数

sysconf()函数是一个库函数,可在运行时获取系统的一些配置信息,譬如页大小(page size)、主机名的最大长度、进程可以打开的最大文件数、每个用户 ID 的最大并发进程数等。其函数原型如下所示:

#include <unistd.h>
long sysconf(int name);

使用该函数需要包含头文件<unistd.h>
调用 sysconf()函数获取系统的配置信息,参数 name 指定了要获取哪个配置信息,参数 name 可取以下任何一个值(都是宏定义,可通过 man 手册查询):

⚫ _SC_ARG_MAX:exec 族函数的参数的最大长度,exec 族函数后面会介绍,这里先不管!
⚫ _SC_CHILD_MAX:每个用户的最大并发进程数,也就是同一个用户可以同时运行的最大进程数。
⚫ _SC_HOST_NAME_MAX:主机名的最大长度。
⚫ _SC_LOGIN_NAME_MAX:登录名的最大长度。
⚫ _SC_CLK_TCK:每秒时钟滴答数,也就是系统节拍率。
⚫ _SC_OPEN_MAX:一个进程可以打开的最大文件数。
⚫ _SC_PAGESIZE:系统页大小(page size)。
⚫ _SC_TTY_NAME_MAX:终端设备名称的最大长度。
⚫ ……

除以上之外,还有很多,这里就不再一一列举了,可以通过 man 手册进行查看,用的比较多的是_SC_PAGESIZE_SC_CLK_TCK,若指定的参数 name 为无效值,则 sysconf()函数返回-1,并会将 errno 设置为 EINVAL。否则返回的值
便是对应的配置值。注意,返回值是一个 long 类型的数据。

使用示例
获取每个用户的最大并发进程数、系统节拍率和系统页大小。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
    printf("每个用户的最大并发进程数: %ld\n", sysconf(_SC_CHILD_MAX));
    printf("系统节拍率: %ld\n", sysconf(_SC_CLK_TCK));
    printf("系统页大小: %ld\n", sysconf(_SC_PAGESIZE));
    exit(0);
}

运行结果:

sundp@sundongpeng:~/workspace/c_program/April$ gcc sysconf.c
sundp@sundongpeng:~/workspace/c_program/April$ ./a.out
每个用户的最大并发进程数: 31581
系统节拍率: 100
系统页大小: 4096

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

面向对象编程(基础)7:再谈方法(重载)

目录 7.1 方法的重载&#xff08;overload&#xff09; 7.1.1 概念及特点 7.1.2 示例 举例1&#xff1a; 举例2&#xff1a; 举例3&#xff1a;方法的重载和返回值类型无关 7.1.3 练习 **练习1&#xff1a;** 练习2&#xff1a;编写程序&#xff0c;定义三个重载方法并…

如何大批量扫描的发票进行ocr识别导出Excel表格和WPS表格

OCR技术&#xff1a;OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;是将数字图像中的文字识别成字符代码的技术&#xff0c;在发票识别中应用广泛。通过OCR技术&#xff0c;可以将图片发票上的信息识别出来&#xff0c;并导出到Excel表格中…

3年测试越来越迷茫... 技术跟不上接下来是不是要被淘汰了?

这两天和朋友聊到了软件测试的发展&#xff1a;这一行的变化确实蛮大&#xff0c;从开始最基础的功能测试&#xff0c;到现在自动化、性能、安全乃至于以后可能出现的大数据测试、AI测试岗位需求逐渐增多。我也在软件测试这行摸爬滚打有些日子了&#xff0c;正好有朋友问我&…

晶振01——晶振分类和无源晶振的设计

晶振 晶振相当于人的心脏&#xff0c;能跳动&#xff0c;整个系统才是“活的”。 晶振常见有有源晶振、无源晶振。 有源晶振比较贵&#xff0c;但是需要外围电路少&#xff0c;供个电就能工作。 无源晶振价格便宜&#xff0c;匹配电路复杂些。 以无源晶振进行分析&#xff0c…

WCF手麻系统源码,手术室麻醉临床系统源代码,商业源码 有演示

手麻系统源码 手术麻醉系统源码 手术室麻醉临床信息系统源码 商业级源码&#xff0c;有演示&#xff0c;三甲医院临床应用多年&#xff0c;系统稳定。 文末获取联系&#xff01; 技术架构&#xff1a;C# .net 桌面软件 C/S版&#xff0c;前后端分离&#xff0c;仓储模式 开发语…

2.5.3 乘法

这段话告诉我们&#xff0c;在程序中有一条乘法运算语句。这个程序会让计算机帮助我们完成一个简单的数学问题&#xff1a;计算6乘以2。和我们平常做数学题一样&#xff0c;程序使用*号表示乘法运算。语句 “feet 6 * fathoms;” 可以这样理解&#xff1a;它会找到之前我们定义…

spring 随笔 async 1-源码走读

0. 这一块比较简单&#xff0c;还就内个无障碍阅读 不谈,放个调用栈的日志先 … // 我们自己写的 Async 注解的方法 simpleTest:31, TestAsyncTestService (cn.angel.project.angelmicroservicesample.test.service) invoke:-1, TestAsyncTestService$$FastClassBySpringCGLI…

手撕vector

文章目录一.vector的基本结构二.构造函数调用不明确三.迭代器失效&#xff08;其实是野指针问题&#xff09;a.扩容导致的迭代器失效b.意义不同四.深层次的深浅拷贝五.整体代码实现有了前面模拟实现string的经验&#xff0c;vector对大家来说也不会算很难。vector本质也就是一个…

【ORACLE】极速通关Oracle23c开发者免费版连接

前言 oracle23c开发者免费版已经于2023年4月4日(北京时间)推出&#xff0c;并且官方也公布了安装介质的下载地址&#xff0c;有RPM安装包、VM虚拟机、docker镜像&#xff08;下载链接见文末&#xff09;。 由于最近工作比较忙&#xff0c;暂时无法写一篇内容丰富的测试&#x…

springboot树形结构接口, 懒加载实现

数据库关系有父子id的, 作为菜单栏展示时需要用前端需要用到懒加载, 所谓懒加载就是接口有一个标志位isLeaf, 前端请求后通过该字段判断该节点是否还有子节点数据 创建数据库表 t_company_info结构有id和parentId标识, 用来表示父子关系 /*Navicat Premium Data TransferSourc…

大数据环境-云平台(阿里云)

由于电脑配置原因&#xff0c;无法在本地利用虚拟机搭建环境&#xff0c;因此使用云平台来当做学习的环境。 本节内容参考&#xff1a; 【2023新版黑马程序员大数据入门到实战教程&#xff0c;大数据开发必会的Hadoop、Hive&#xff0c;云平台实战项目全套一网打尽-哔哩哔哩】 …

72-Linux_线程同步

线程同步一.什么是线程同步二.线程同步的方法1.互斥锁(1)什么是互斥锁(2)互斥锁的接口(3)互斥锁的使用(例题)2.信号量(1)什么是信号量(2)信号量的接口(3)信号量的使用(例题)a.循环打印ABCb.:主线程获取用户输入,函数线程将用户输入的数据存储到文件中;3.读写锁(1)读写锁的接口(…

R语言|plot和par函数绘图详解,绘图区域设置 颜色设置 绘图后修改及图像输出

plot()函数 plot()函数是R中最基本的绘图函数&#xff0c;其实最简单、最基础的函数&#xff0c;这也就意味着其具有更多的可操作性。 plot(x,y,...) 在plot函数中&#xff0c;只需指定最基本的x和y轴对应数据即可进行图像的绘制&#xff0c;x和y轴数据分别为两个向量或者是只…

年薪40W测试工程师成长之路,你在哪个阶段?

对任何职业而言&#xff0c;薪资始终都会是众多追求的重要部分。前几年的软件测试行业还是一个风口&#xff0c;随着不断地转行人员以及毕业的大学生疯狂地涌入软件测试行业&#xff0c;目前软件测试行业“缺口”已经基本饱和。当然&#xff0c;我说的是最基础的功能测试的岗位…

WIN10無法再使用 IE 瀏覽器打开网页解决办法

修改 Registry&#xff08;只適用 Win10&#xff09; 微軟已於 2023 年 2 月 14 日永久停用 Internet Explorer&#xff0c;會透過 Edge 的更新讓使用者開啟 IE 時自動導向 Edge&#xff0c;其餘如工作列上的圖示&#xff0c;使用的方法則是透過「品質更新」的 B 更新來達成&am…

NoSQL与Redis五次作业回顾

文章目录1. 作业12. 作业23. 作业34. 作业45. 作业51. 作业1 要求&#xff1a; 在 VM 上安装 CentOS Linux 系统&#xff0c;并在 Linux 上通过 yum 安装 C编译器&#xff0c;对 Redis 进行编译安装。 观察 Redis 目录结构&#xff0c;使用 redis-server 启动服务器&#xff…

Android---Jetpack之DataBinding

DataBinding 的意义 让布局文件承担了部分原本属于页面的工作&#xff0c;使页面与布局耦合度进一步降低。 DataBinding 的应用 使用 dataBinding 需要在 gradle 里添加如下代码 dataBinding{enabled true} 应用实现 activity_main.xml <?xml version"1.0" e…

python argparse的使用,本文基本够用

一、前言 在学习深度学习会发现都比较爱用python这个argparse&#xff0c;虽然基本能理解&#xff0c;但没有仔细自己动手去写&#xff0c;因此这里写下来作为自己本人的学习笔记 argparse是python的一个命令行参数解析包&#xff0c;在代码需要频繁修改参数时&#xff0c;方便…

Shell编程之免交互

目录交互的概念与Linux中的运用Here Document 免交互tee命令重定向输出加标准输出支持变量替换多行注释Expect实例操作免交互预设值修改用户密码创建用户并设置密码实现 ssh 自动登录交互的概念与Linux中的运用 交互&#xff1a;当计算机播放某多媒体程序的时候&#xff0c;编…

步进频雷达的一维距离像matlab仿真

步进频雷达的一维距离像matlab仿真发射与回波信号模型距离高分辨原理仿真分析不进行步进频高分辨一维距离像进行步进频高分辨一维距离像代码发射与回波信号模型 步进频率信号发射得的是一串窄带的相参脉冲&#xff0c;每个脉冲的载频之间是均匀线性步进的&#xff0c;经过相参本…