Linux系统编程Day7 -- 基于Linux系统知识的第一个程序

     往期内容回顾

        自动化构建工具-make/Makefile

        gcc/g++编译及链接

        Vim工具的使用

        Linux常用工具(yum与vim)

       ​​​​​​ Linux系统编程Day4-- Shell与权限

编写第一个Linux程序

        今天我们要利用我们所学到的Linux语言来编译第一个Linux程序,在进行编写之前,我们首先要理解以下两个问题:

1、缓冲区问题

什么是缓冲区

  • 缓冲区就是一块内存,用来临时存储数据,等满足某些条件再一次性读写。

  • 在 C 语言和 Linux 中,printf、scanf、fgets 等函数并不是直接操作硬件,而是先把数据放到缓冲区,再由系统调用(write、read)发送/接收。

为什么要有缓冲区

  • 效率:硬件 IO 操作(如磁盘、终端)很慢,如果每个字符都直接写到终端,速度很低。

  • 减少系统调用次数:批量处理数据比一次一次调用 write() 更高效。

缓冲区的类型

Linux 中标准输入输出有三种缓冲模式:

缓冲模式

特点

典型场景

全缓冲(Fully buffered)

缓冲区满了才输出

文件 IO

行缓冲(Line buffered)

遇到换行符 \n 或缓冲区满才输出

终端 IO

无缓冲(Unbuffered)

直接输出,不用缓冲区

stderr

举个例子

#include<stdio.h>
#include<unistd.h>int main(){printf("You can see me !--------");// 没有换行,不会立即显示sleep(3); // 系统休眠3sreturn 0;
}

   这里我们写了一个这样的程序,printf中没有换行符,当运行程序时:

不会立马输出printf中的内容,而是先休眠3s在输出。

原因:

        在终端运行时,你可能看不到 "You can see me",因为printf先把数据放到缓冲区,再由系统调用,导致系统先休眠了,等休眠解释之后在由标准输出。

如何解决这个问题呢?

  1. 在 printf 后加 \n(行缓冲会触发刷新)

  2. 手动 fflush(stdout);


2、回车换行

概念区别

  • 回车(Carriage Return,CR,\r):光标回到行首(但不换行)

  • 换行(Line Feed,LF,\n):光标移动到下一行(但不回到行首)

  • 历史原因:打字机时代是两个独立动作,后来延续到了计算机。

不同系统的表示

系统

换行符号

ASCII 表示

Linux / macOS

\n

LF (0x0A)

Windows

\r\n

CR+LF

旧版 Mac (pre-OSX)

\r

CR (0x0D)

为什么要理解

  1. 跨平台差异:Windows 文本文件带 \r\n,Linux 用 \n,直接用 cat 或 vi 可能多出 ^M。

  2. 输入读取行为:终端输入时按下回车,Linux 会发送 \n,Windows 会发送 \r\n。

  3. 缓冲区刷新的触发:行缓冲模式下,遇到 \n 会触发刷新。

总结

  • 缓冲区决定了输出什么时候真正显示(影响程序交互和性能)。

  • 回车换行决定了不同系统下文本和输入输出的表现(影响跨平台兼容性)。

  • 在写 Linux 程序时,这两个问题会直接影响输出顺序、数据同步、终端交互


3、进度条程序的实现

#include <iostream>
#include <iomanip>   // std::setw
#include <unistd.h>  // sleep
using namespace std;void showProgressBar(int total, int current) {const int barWidth = 50; // 进度条长度float progress = (float)current / total;int pos = (int)(barWidth * progress);cout << "[";for (int i = 0; i < barWidth; ++i) {if (i < pos) cout << "=";else if (i == pos) cout << ">";else cout << " ";}cout << "] ";// 输出百分比,宽度3,右对齐cout << setw(3) << (int)(progress * 100) << "%  ";// 输出倒计时秒数cout << "(" << (total - current) << "s left)" << "\r" << flush;
}int main() {int totalSeconds = 10;for (int i = 0; i <= totalSeconds; ++i) {showProgressBar(totalSeconds, i);sleep(1);}cout << endl; // 结束时换行return 0;
}

说明:

  • 使用了 \r(回车)使光标回到行首,实现刷新覆盖输出。

  • 用 flush 刷新输出缓冲区,确保进度条及时显示。

  • 进度条长度固定为50,随时间更新,视觉效果流畅。

  • 显示百分比和剩余秒数,清晰易懂。


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

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

相关文章

安卓264和265编码器回调编码数据写入.265或者.264文件、查看编码数据是否正确、转换为Mp4文件、查看Mp4文件信息等方法合集

一、写入文件 1、变量定义 private FileOutputStream m265FileOutputStream null; private File m265File null; private static final String HEVC_265_FILE_NAME "output.265"; // 或 .265 private static final String AVC_264_FILE_NAME "output.264&qu…

如何打造一支AI时代下的IT团队,为企业战略目标快速赋能

执行摘要 在当前AI技术迅猛发展的背景下&#xff0c;中国中小企业正面临着前所未有的数字化转型机遇与挑战。据最新调研显示&#xff0c;2025年全球AI市场规模将突破5000亿美元&#xff0c;而中国AI应用占比已达35%。与此同时&#xff0c;AI领域人才缺口高达1000万人&#xff0…

机器学习-LinearRegression

1、 关键数学知识点&#xff1a; 边缘概率密度 联合密度对非关注变量积分&#xff1a;fX(x)∫fX,Y(x,y)dyf_X(x)∫f_{X,Y}(x,y)dyfX​(x)∫fX,Y​(x,y)dy&#xff1b; 条件概率密度 切片 fX∣Y(x∣y)fX,Y(x,y)/fY(y)f_{X|Y}(x|y)f_{X,Y}(x,y)/f_Y(y)fX∣Y​(x∣y)fX,Y​(x,y)…

解决微信小程序中如何把npm构建的模块与主包分离,构建到分包上面

1、配置分包2、复制packge.json到分包中3、在project.config.json中增加npm配置4、终端执行npm i下载模块5、构建npm到miniprogram_npm中

自动驾驶中的传感器技术21——Camera(12)

自动驾驶摄像头的图像评测 摄像头的性能受到环境光照、天气条件、运动模糊等因素的影响&#xff0c;因此需要通过多方面的评测来确保其在各种场景下的可靠性。 在自动驾驶领域&#xff0c;图像质量评估不仅关注图像的清晰度、分辨率等传统指标&#xff0c;还需要结合目标检测…

AI+OA原生应用 麦当秀AIPPT

麦当秀也在WAIC期间重新定义AIOA一、什么是“原生AI”&#xff1f;“原生AI”可以理解为&#xff1a;AI系统本身具备完整的办公能力&#xff0c;不需要依赖传统办公软件&#xff08;如Word、Excel、PPT&#xff09;作为载体。也就是说&#xff0c;用户可以直接通过AI系统完成文…

K8S 入门操作

之前一直用kubectl这个命令操作&#xff0c;这些都是基于命令来操作K8S kubectl get pods kubectl get nodes kubectl get svc kubectl create deployment... kubectl expose deployment...kubectl 文档 命令行工具 (kubectl) | Kubernetes 命令参考 Kubectl Reference Doc…

蒙文OCR识别技术难点实现及应用场景剖析

一、蒙文OCR识别核心技术难点1. 文字特性带来的识别挑战连写特性&#xff1a;蒙文字符存在复杂的连写形式&#xff08;词首、词中、词尾变形&#xff09;方向特异性&#xff1a;传统蒙文为垂直书写&#xff08;现代也有横排&#xff09;&#xff0c;需特殊方向处理字符相似性&a…

通过docker构建一个java镜像

通过docker构建一个java镜像 FROM zlyxzq/centos7:v1 VOLUME /tmp WORKDIR /app COPY /target/aa.jar /root/app/aa.jarENV TZAsia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezoneENV JAVA_HOME /usr/local/java ENV PA…

SpringBoot学习日记 Day5:解锁企业级开发核心技能

一、前言&#xff1a;从玩具项目到生产系统经过前四天的学习&#xff0c;我们已经能够开发基础功能了。但要让应用真正具备生产价值&#xff0c;还需要掌握数据库高级操作、事务控制、缓存优化等企业级开发技能。今天就来攻克这些关键知识点&#xff01;二、JPA进阶&#xff1a…

将英文PDF文件完整地翻译成中文的4类方式

文章目录一、在线翻译服务&#xff08;最快捷&#xff0c;适合临时查看&#xff09;1.1 代表工具&#xff1a;1.2 操作流程&#xff08;以Google翻译为例&#xff09;1.3 优点和缺点1.4 适用场景二、专业软件&#xff08;最佳平衡&#xff0c;兼顾格式与质量&#xff09;2.1 代…

【分享】我国八大沙漠空间矢量范围

今天小编整理分享的是 我国八大沙漠空间矢量范围shp。▲ 我国八大沙漠空间矢量范围概况数据概况我国八大沙漠空间矢量范围。中国八大沙漠。分别为腾格里沙漠&#xff0c;塔克拉马干沙漠&#xff0c;巴丹吉林沙漠&#xff0c;库布奇沙漠&#xff0c;乌兰布和沙漠&#xff0c;库…

【音视频】WebRTC C++ native 编译

一、搭建环境 我们这里介绍在Windows10VS2019的环境下编译WebRTC源码&#xff0c;由于WebRTC源码在外网上&#xff0c;需要科学的方式下载&#xff0c;不然下载特别慢&#xff0c;建议直接找国内下载好的源码&#xff0c;这里的源码是2021年的版本&#xff1a;https://pan.bai…

Selenium在Pyhton应用

目录 1. selenium的基本原理 2. selenium环境的搭建步骤 3. 元素的定位和操作 4.元素的基本属性方法 5.浏览器的操作方法 6.三种等待 强制等待 显示等待 隐式等待 7. 键盘与鼠标的操作 鼠标悬停用 拖拽操作 8. 下拉框元素定位 9.页面滚动操作 10. 页面截图操作 S…

【Docker】Redis基础命令在Docker中的使用

文章目录一 Redis 容器化部署指南1 获取 Redis 镜像2 服务启动2.1 首次启动新容器2.2 重启已有容器3 服务验证4 连接 Redis5 数据持久化方案5.1 使用 Docker 卷5.2 启用 AOF 持久化6 容器管理6.1 停止容器6.2 删除容器7 数据清理7.1 清空 Redis 数据7.2 完全移除7.3 删除数据卷…

ubuntu 2024 安装拼音输入法

1. 卸载ibussudo apt remove ibus2. install fcitx5核心组件sudo apt install fcitx5 fcitx5-chinese-addons fcitx5-material-color3. 安装中文语言支持sudo apt install language-pack-zh-hans4. 设置默认输入法im-config -n fcitx55. 配置环境变量sudo vim ~/.bashrc粘贴&am…

语言模型的多个agent

是的&#xff0c;语言模型 在某些情况下确实可以通过多个 agent&#xff08;代理&#xff09;来共同协作完成任务。这种设计通常用于复杂任务或需要多步骤处理的场景&#xff0c;具体的流程如下&#xff1a; 1. 什么是 Agent&#xff1f; Agent&#xff08;代理&#xff09; 是…

CSS--:root指定变量,其他元素引用

原文网址&#xff1a;CSS--:root指定变量&#xff0c;其他元素引用-CSDN博客 简介 本文介绍CSS中使用变量的方法。 场景描述 CSS可以使用变量&#xff0c;比如&#xff1a;指定整个网页的主体颜色作为变量&#xff0c;其他的元素去使用这个颜色。这样在修改颜色时&#xff…

秋招笔记-8.7

今天先来补充一下关于Unity和UE的一些问题&#xff0c;后续开始深挖项目&#xff1a;Unity关于fixed update和update&#xff1a;同一帧中物理更新优先执行&#xff1f;关于协程&#xff1a;协程是基于迭代器实现的&#xff0c;而迭代器是基于状态机实现的。协程的本质是编译器…

DAY 26 函数专题1:函数定义与参数

浙大疏锦行知识点回顾&#xff1a; 函数的定义变量作用域&#xff1a;局部变量和全局变量函数的参数类型&#xff1a;位置参数、默认参数、不定参数传递参数的手段&#xff1a;关键词参数传递参数的顺序&#xff1a;同时出现三种参数类型时 作业 #作业1 import math def calcul…