程序人生 | UNIX环境高级编程技巧之 df 指令实现

从Notebook到生产:机器学习模型的契约化部署实践 机器学习模型部署不是简单导出代码,而是建立覆盖数据、模型、服务与可观测性的全链路运行时契约。其核心原理在于通过环境隔离、类型约束、冷热分离和结构化验证,消除训练与推理间的语义漂移和执行上下文混淆。这种契约驱动范式显著提升模型预测结果的可预期性、可审计性与可回滚性,技术价值体现在降低线上故障率、加速问题归因、支撑灰度发布与A/B测试。典型应用场景包括电商推荐、金融风控、广告CTR预估等对稳定性与一致性要求严苛的工业级AI服务。本文聚焦FastAPI+Pydantic+ONNX+Great Expectatio 阅读详情

本文首发于 2014-07-10 09:48:48

代码

#include <stdio.h>
#include <mntent.h>
#include <string.h>
#include <sys/vfs.h>

static const unsigned long long G = 1024*1024*1024ull;
static const unsigned long long M = 1024*1024;
static const unsigned long long K = 1024;
static char str[20];

char* kscale(unsigned long b, unsigned long bs)
{
    unsigned long long size = b * (unsigned long long)bs;
    if (size > G)
    {
        sprintf(str, "%0.2f GB", size/(G*1.0));
        return str;
    }
    else if (size > M)
    {
        sprintf(str, "%0.2f MB", size/(1.0*M));
        return str;
    }
    else if (size > K)
    {
        sprintf(str, "%0.2f K", size/(1.0*K));
        return str;
    }
    else
    {
        sprintf(str, "%0.2f B", size*1.0);
        return str;
    }
}

int main(int argc, char *argv[])
{
    FILE* mount_table;
    struct mntent *mount_entry;
    struct statfs s;
    unsigned long blocks_used;
    unsigned blocks_percent_used;
    const char *disp_units_hdr = NULL;
    mount_table = NULL;
    mount_table = setmntent("/etc/mtab", "r");

    if (!mount_table)
    {
        fprintf(stderr, "set mount entry error\n");
        return -1;
    }

    disp_units_hdr = "     Size";
    printf("Filesystem           %-15sUsed Available %s Mounted on\n",
            disp_units_hdr, "Use%");
    while (1) {
        const char *device;
        const char *mount_point;
        if (mount_table) {
            mount_entry = getmntent(mount_table);
            if (!mount_entry) {
                endmntent(mount_table);
                break;
            }
        }
        else
            continue;
        device = mount_entry->mnt_fsname;
        mount_point = mount_entry->mnt_dir;
        //fprintf(stderr, "mount info: device=%s mountpoint=%s\n", device, mount_point);
        if (statfs(mount_point, &s) != 0)
        {
            fprintf(stderr, "statfs failed!\n");
            continue;
        }
        if ((s.f_blocks > 0) || !mount_table )
        {
            blocks_used = s.f_blocks - s.f_bfree;
            blocks_percent_used = 0;
            if (blocks_used + s.f_bavail)
            {
                blocks_percent_used = (blocks_used * 100ULL
                        + (blocks_used + s.f_bavail)/2
                        ) / (blocks_used + s.f_bavail);
            }
            /* GNU coreutils 6.10 skips certain mounts, try to be compatible.  */
            if (strcmp(device, "rootfs") == 0)
                continue;
            if (printf("\n%-20s" + 1, device) > 20)
                    printf("\n%-20s", "");
            char s1[20];
            char s2[20];
            char s3[20];
            strcpy(s1, kscale(s.f_blocks, s.f_bsize));
            strcpy(s2, kscale(s.f_blocks - s.f_bfree, s.f_bsize));
            strcpy(s3, kscale(s.f_bavail, s.f_bsize));
            printf(" %9s %9s %9s %3u%% %s\n",
                    s1,
                    s2,
                    s3,
                    blocks_percent_used, mount_point);
        }
    }

    return 0;
}

编译

$ gcc -g -Wall testdf.c -o testdf

运行

  • testdf执行效果:
$ ./testdf
Filesystem                Size      Used Available Use% Mounted on
udev                   3.87 GB    0.00 B   3.87 GB   0% /dev
tmpfs                796.17 MB  980.00 K 795.21 MB   0% /run
/dev/vda1             96.75 GB  40.54 GB  56.19 GB  42% /
tmpfs                  3.89 GB    0.00 B   3.89 GB   0% /dev/shm
tmpfs                  5.00 MB    0.00 B   5.00 MB   0% /run/lock
tmpfs                  3.89 GB    0.00 B   3.89 GB   0% /sys/fs/cgroup
/dev/vda15           104.35 MB   3.86 MB 100.50 MB   4% /boot/efi
/dev/loop1            55.50 MB  55.50 MB    0.00 B 100% /snap/core18/2074
/dev/loop2            70.62 MB  70.62 MB    0.00 B 100% /snap/lxd/16922
/dev/loop4            70.38 MB  70.38 MB    0.00 B 100% /snap/lxd/21029
/dev/loop5            32.38 MB  32.38 MB    0.00 B 100% /snap/snapd/12704
tmpfs                796.17 MB  980.00 K 795.21 MB   0% /run/snapd/ns
tmpfs                796.17 MB    0.00 B 796.17 MB   0% /run/user/1000
/dev/loop6            55.50 MB  55.50 MB    0.00 B 100% /snap/core18/2128
/dev/loop0            32.38 MB  32.38 MB    0.00 B 100% /snap/snapd/12883
  • 原生df执行效果:
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            3.9G     0  3.9G   0% /dev
tmpfs           797M  980K  796M   1% /run
/dev/vda1        97G   41G   57G  42% /
tmpfs           3.9G     0  3.9G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/vda15      105M  3.9M  101M   4% /boot/efi
/dev/loop1       56M   56M     0 100% /snap/core18/2074
/dev/loop2       71M   71M     0 100% /snap/lxd/16922
/dev/loop4       71M   71M     0 100% /snap/lxd/21029
/dev/loop5       33M   33M     0 100% /snap/snapd/12704
tmpfs           797M     0  797M   0% /run/user/1000
/dev/loop6       56M   56M     0 100% /snap/core18/2128
/dev/loop0       33M   33M     0 100% /snap/snapd/12883

欢迎关注我的微信公众号【数据库内核】:分享主流开源数据库和存储引擎相关技术。

标题网址
GitHubhttps://dbkernel.github.io
知乎https://www.zhihu.com/people/…
思否(SegmentFault)https://segmentfault.com/u/db…
掘金https://juejin.im/user/5e9d3e…
开源中国(oschina)https://my.oschina.net/dbkernel
博客园(cnblogs)https://www.cnblogs.com/dbkernel
Linux入门实战:从零构建系统观与核心操作流 如果你是一名开发者,或者正在向技术岗位转型,那么“Linux”这个词一定不会陌生。从服务器运维、云计算、容器化到嵌入式开发,Linux 系统几乎无处不在。然而,对于很多初学者来说,Linux 的学习路径却异常模糊:是应该从枯燥的命令行开始死记硬背,还是直接上手某个发行版?网上教程千千万,为什么自己照着做还是频频报错,连系统都装不好? 问题的核心在于,大多数入门材料要么过于理论化,脱离实际环境;要么是零散的“命令大全”,缺乏系统性的场景串联。这导致很多新手在“从入门到放弃”的边缘反复横跳。实际上,掌握 Lin 阅读详情

相关推荐

智慧学堂公众号版1.8.1部署全攻略:从环境配置到微信对接

在公众号生态中,基于PHP与MySQL构建的业务系统始终是内容付费与在线教育的主流技术方案。理解LNMP环境下的部署原理,是保障服务稳定运行的基础。这类系统依赖服务器与微信服务器之间的双向通信,通过URL、Token和EncodingAESKey完成签名校验,进而实现用户身份识别、网页授权及支付回调等核心功能。合理配置Nginx伪静态规则、目录权限与数据库字符集(如utf8mb4),直接决定了课程展示、图片上传和订单写入的成败。在实际运维中,从旧版本升级时需优先处理SQL增量脚本与数据备份,避免表结构变更导

weixin_34392435的博客 401

apue编程之参考df代码写的一个简单的df命令的源代码

代码: #include <stdio.h> #include <mntent.h> #include <string.h> #include <sys/vfs.h> static const unsigned long long G = 1024*1024*1024ull; static const unsigned long lo...

weixin_30919571的博客 217

Python数据清洗实战:用RapidFuzz搞定模糊匹配(附完整代码示例)

本文详细介绍了在Python数据清洗中,如何利用RapidFuzz库高效解决字符模糊匹配难题。通过实战代码示例,演示了从处理拼写错误、格式不一致的脏数据,到构建实体对齐与记录去重的完整清洗管道,帮助开发者提升数据质量与处理效率。

pear55的博客 532

df和du命令详解(转帖)

df和du命令详解df命令详细用法a:显示全部的档案系统和各分割区的磁盘使用情形 i:显示i -nodes的使用量 k:大小用k来表示 (默认值) t:显示某一个档案系统的所有分割区磁盘使用量 x:显示不是某一个档案系统的所有分割区磁盘使用量 T:显示每个分割区所属的档案系统名称 常用命令:df -hidu -sh * 查看当前各个目录及文件的大小操作详解

Sagacity──池建强的blog 1625

【Unity】 预制体Prefab使用说明

在 Unity 中,Prefab 是一个可以预先制作并重复使用的 GameObject 或组件集合,Prefab 中的 GameObject 可以有子对象和其他组件。

灵境引路人 2852

人工智能大模型原理与应用实战:AI模型转换为API的步骤和方法

传统的开发模式下,构建复杂的软件系统是非常费时费力的,而通过云计算、微服务等技术手段可以实现快速部署、弹性扩展的能力。在这种背景下,越来越多的公司将重点转移到研发人员的产品思维上,希望能够将自己的AI模型转换为一个可供他人调用的API接口。但是对于许多从事AI领域的研发人员来说,如何将自己的AI模型转换为API是一个比较棘手的问题。在这篇文章中,作者将从AI模型转换为API的过程分为以下几个步骤:AI模型准备阶段——模型选择、数据准备、模型训练。

AI天才研究院 2601

df命令是什么?

df 命令在Unix和类Unix操作系统中用于显示文件系统的磁盘空间使用情况。它可以提供挂载点的总空间、已使用空间、可用空间以及挂载点的文件系统类型等信息。这将显示所有挂载的文件系统的使用情况,以KB、MB、GB等易于理解的单位表示。df 命令对于诊断磁盘空间不足的问题或者仅仅是为了了解各个分区的使用情况非常有帮助。如果没有指定文件或目录,df 会显示所有当前挂载的文件系统的磁盘空间使用情况。如果指定了文件或目录,df 会显示包含这些文件或目录的文件系统的磁盘空间使用情况。

qq_44062110的博客 938

0 基础学前端:100 天拿 offer 实战课(第 16 天)—— JS 数组高级方法:数据处理效率翻倍,代码更简洁

方法名核心作用回调函数返回值返回结果适用场景map数据转换转换后的新元素新数组(长度与原数组一致)格式转换、新增字段、生成 DOM 字符串filter数据筛选true(保留)/false(过滤)新数组(符合条件的元素)筛选符合条件的元素(如未完成计划、今天的评论)reduce数据汇总新的累加值任意类型(数字、对象等)求和、计数、分组、多数据汇总find查找元素true(匹配)/false(不匹配)第一个匹配的元素 /undefined。

苏打水.X的博客 135

Linux系统环境下的df指令详解

Linux下的df指令是磁盘空间监控与问题排查利器简介:在Linux系统中,磁盘空间是一项重要的资源。为了有效管理和监控磁盘空间的使用情况,我们需要使用df指令。本篇博客将以通俗易懂的方式,详细介绍df指令的前世今生、功能、用法和应用场景,帮助读者全面了解df指令,并掌握其在磁盘管理和问题排查方面的应用。

AnChenliang_1002的博客 4148

朱长江《偏微分方程简明教程》答案第一章部分

偏微分方程简明教程第一章习题1.1 第一章 习题1.1 1、指出下列方程的阶,并判断它是线性的还是非线性的。如果是线性的,说明它还是其次的: (1)ut−(uxx+uyy)+1=0;(2)ut−uxx+xu=0;(3)ut−uxxt+uux=0;(4)ux2+uuy=0;(5)utt−uxx+t2+x2=0;(6)ux+eyuy=0;(7)ut+uxxxx+1+u=0;(8)ux(1+ux2)−12+uy(1+uy2)−12=0;(9)∂4u∂x4+2∂4u∂x2∂y2+∂4u∂y4=0;(10)∂3u∂x

ymengm的博客 6761

099、LLC谐振变换器的大信号建模

摘要:LLC谐振变换器的小信号模型在大信号工况(如启动、负载突变)下会失效,导致保护失灵、过冲等问题。通过状态空间平均法和分段线性化建立大信号模型,需关注谐振腔能量转移、模态切换条件及离散化实现。实际应用中,该模型可优化启动策略、精确设定保护阈值并验证环路补偿,但需注意变压器饱和等非线性因素。经验表明,大信号建模能显著提升设计可靠性,但需结合实验验证(误差<15%)和工具适配(如MATLAB离线仿真与C语言嵌入式调试)。三颗炸裂的MOSFET警示:深入掌握大信号建模是避免关键故障的必要手段。

Jack010169的博客 47

在 Linux/Unix 系统中,df(Disk Filesystem)命令的详细解释。

df)是 Linux/Unix 系统中用于显示的核心命令。它会报告文件系统的总容量、已用空间、剩余空间以及挂载点等信息,是排查磁盘空间问题的必备工具。

2202_75711937的博客 1018

OpenCV计算机视觉实战(12)——图像金字塔与特征缩放

图像金字塔技术通过对原始图像按不同分辨率进行多层次表示,不仅能提升计算效率,还能为图像融合、检测与识别提供多尺度特征。高斯金字塔 (Gaussian Pyramid) 用于构建多级低通图像,拉普拉斯金字塔 (Laplacian Pyramid) 则提取各层之间的细节信息。本节将深入介绍如何使用 OpenCV 构建高斯与拉普拉斯金字塔,并以经典的图像融合案例,展示图像金字塔在特征缩放与融合中的强大应用。

qq_30167691的博客 1404

程序人生 | UNIX环境高级编程技巧之 du 指令实现

程序人生 | UNIX环境高级编程技巧之 du 指令实现

dbkernel 的博客 168

具身智能(40):主流 VLA 模型π₀

摘要: π₀是首款专为机器人设计的VLA(视觉-语言-动作)端到端基础模型,通过双阶段训练实现“感知-决策-执行”闭环。其创新点包括:1)FlowMatching技术实现连续平滑动作控制(精度0.3°);2)结合VLM预训练与多机器人实操数据,零样本任务完成率达76.4%,远超同类模型;3)支持模糊指令理解与动态场景适应(如遮挡识别)。开源版本涵盖不同规模模型,适用于工业装配、服务机器人等场景,在延迟(213ms)和稳定性(92%自主恢复率)上显著领先OpenVLA等竞品。

码农17年的博客 512

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

从Unix到Linux:系统分层、发行版与虚拟机排错入门

对于刚开始接触Linux的开发者,Unix与Linux的关系、发行版差异和命令背后的系统结构常令人困惑。理解Linux的关键在于操作系统分层:内核态与用户态通过硬件特权级隔离,系统调用是用户程序进入内核的唯一合法通道,POSIX则用接口标准保证类Unix系统间的源码兼容。这套结构决定了“一切皆文件”、Shell只是普通进程、发行版只是内核与工具链的打包组合。掌握这些概念后,在虚拟机中安装Ubuntu或Rocky Linux、配置软件源与快照,排查Docker daemon无法连接、MySQL socket目

weixin_34354945的博客 331

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Linux基础入门:高频命令与程序编译实战指南

在Linux系统中,命令行是人与操作系统交互的核心方式,其设计哲学“一切皆文件”让文件和目录操作成为最基础也最高频的场景。理解这一原理后,日常的ls、cd、cp、rm等常用命令就不再是零散记忆,而是围绕文件管理的自然延伸。与此同时,程序编译是开发者绕不开的环节,从预处理、编译、汇编到链接,gcc/g++工具链将源码转化为可执行文件,这个过程看似简单,却决定了程序能否正确运行。掌握Linux常用命令和编译流程,不仅能提升服务器运维、嵌入式开发的效率,还能帮助新手快速定位权限、路径、编码等常见问题。本文聚焦这两

weixin_30247781的博客 299

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

如何成为一名优秀的运维工程师?这些技能你必须掌握!

运维不仅仅是技术活,更多的是人与技术的结合。沟通能力、复杂问题解决能力、压力管理和学习能力都是运维工程师在长期工作中不可或缺的技能。具备这些软实力,能够让你在技术过硬的同时,成为一名真正的全能运维专家,在职业生涯中走得更远、更稳。

qaz9821的专栏 2314

Docker常用命令实战指南:从环境配置到微服务部署全解析

容器化技术已成为现代软件交付与部署的核心基础设施,而掌握Docker命令是驾驭容器化应用的第一步。理解镜像、容器、数据卷与网络模式的基本原理,是熟练使用docker run、docker compose等命令的前提。通过将应用及其依赖打包成标准镜像,开发者可以在任何环境中实现一致性的运行效果,大幅降低环境差异带来的运维成本。在实际工程中,无论是本地开发环境的中间件搭建、微服务架构的容器编排,还是生产环境下的资源隔离与故障排查,Docker都提供了高效、可复用的解决方案。本文从环境准备与镜像管理出发,系统梳理

weixin_33906657的博客 195

Mac PHP 环境搭建痛点终结者:FlyEnv 多版本管理与扩展配置实战

在 Mac 上进行 PHP 开发,环境搭建与多版本管理常因组件分散、扩展编译复杂而效率低下。其核心在于通过集成化工具统一管理 PHP、Web 服务器、数据库及缓存服务,实现版本一键切换与扩展勾选安装。这种方案能显著降低配置成本,适用于本地多项目并行开发、调试及全栈环境维护。FlyEnv 正是基于此思路,将 PHP 多版本、Nginx/Apache/Caddy 切换、MySQL/PostgreSQL 及 Redis 等整合至图形界面,并简化了 redis、swoole、imagick 等扩展的安装流程,让开发

weixin_32927133的博客 267

Windows安装OpenClaw全指南:WSL2与Docker环境配置及报错排查

在Windows系统上部署开源AI助理框架,往往绕不开环境兼容性问题。WSL2作为Linux子系统的核心组件,为运行容器化服务提供了基础,而Docker则负责隔离依赖和简化部署流程。理解这两者如何协同工作,是解决安装失败的关键。Node.js等基础工具的版本匹配同样影响着依赖安装的稳定性。掌握环境验证、容器集成和常见错误排查方法,能大幅提升部署效率。本文从技术原理出发,结合实际案例,系统梳理了在Windows环境下配置运行环境的完整路径,涵盖WSL2激活、Docker Desktop集成、Node版本选择等

weixin_32932149的博客 86

我们一起学shell之一:shell了解

写在最前面!!!!!!by skyfans 下定决心,开始编写这方面的博客内容。原因很简单,自己做了运维近8年,从最开始的windows服务器运维到后来接触linux,是一个漫长的过程,也不是一个漫长的时间。技术这玩意,更新的越来越快,如果作为一名技术人员,不努力,永远也赶不上技术的快轨列出。也很清楚的记得一个童鞋回来和我说的东西:我去面试的时候那个经理给我出了一个shell的题,我没有直接答上来...

skyfans的博客 349

CentOS源码编译安装MySQL 8.0:从依赖准备到参数定制全攻略

数据库服务的部署方式多种多样,常见的有包管理工具安装、二进制解压和源码编译。源码编译是指从源代码直接构建可执行程序的过程,需要配置编译参数、解决依赖关系,对系统工具链有较高要求。它的核心价值在于可控性:可自定义安装路径、字符集、存储引擎等,并能针对CPU指令集进行优化,适用于深度定制、离线环境部署及深入理解数据库底层结构的场景。在CentOS等Linux系统上源码编译MySQL 8.0,需要准备gcc、cmake、boost等依赖,并妥善处理版本兼容与内存资源问题。本文以实际操作为基础,完整展示了从环境准备

weixin_31423955的博客 238

Linux进程全方位解析:从原理到排障,一文吃透操作系统核心主线

进程是操作系统最核心的基础概念,也是Linux运维与开发面试中的高频考点。无论是日常执行命令、排查CPU飙升,还是理解fork和exec的底层机制,都离不开对进程生命周期的清晰认知。从程序到进程的转变涉及PID、地址空间与进程控制块;而fork的写时复制与exec的换壳机制,则揭示了Linux创建进程的精妙设计。理解进程状态机中R、S、D、Z等状态,有助于快速定位系统异常。同时,进程间通信(IPC)的多种方式——管道、信号、共享内存与Socket——构成了多任务协作的基础。掌握ps、top、ss等命令的深层

weixin_34216196的博客 344

零基础掌握Linux核心命令:20个命令解决80%开发问题

你是不是也遇到过这样的场景:刚接触编程,满怀热情地打开教程,第一步就卡在了“打开终端,输入命令”上?看着屏幕上闪烁的光标和一堆看不懂的字母,瞬间感觉自己和“大神”之间隔着一座 Linux 命令的大山。 别慌,这种感觉每个程序员都经历过。Linux 命令不是洪水猛兽,它更像是一套高效的“键盘快捷键”,让你能直接和计算机对话,完成文件管理、程序运行、网络调试等所有操作。对于开发者而言,无论你是做后端、前端、数据科学还是运维,Linux 命令行都是绕不开的必备技能。它决定了你解决问题的效率上限。 网上有很多“Li

weixin_33946020的博客 327

UU远程:重新定义终端交互体验的底层优化工具

终端远程连接本质上是基于SSH、Serial等协议的低延迟字节流交互,其核心挑战在于ANSI控制序列解析、TCP Nagle算法干扰、PTY会话状态同步及跨协议抽象。传统工具将终端简单视为文本管道,导致光标卡顿、Tab补全丢字符、Ctrl+C中断延迟等‘体验断层’。UU远程通过状态感知型ANSI解析器、TCP_NODELAY+应用层微缓冲、动态TERM协商与统一终端资源模型,实现毫秒级响应与协议无感接入。它适用于Linux/Unix开发者、嵌入式工程师(如ESP32、CAN总线调试)及远程教学场景,让`vi

weixin_32687875的博客 240
上一篇: 特性介绍 | Linux 内存管理机制解析
下一篇: 程序人生 | UNIX环境高级编程技巧之 du 指令实现
dbkernel
博客等级 码龄4年 60粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值