Linux IO编程 搭建开发环境 学习笔记
虚拟机网络模式配置 Ubuntu 联网时稳定的网络连接是基础前提!虚拟机里的这些网络模式(桥接、NAT、仅主机、自定义、LAN段)决定了 Ubuntu 虚拟机如何跟主机、外部网络打通选对模式既能让 Ubuntu 联网装软件又能让主机顺利实现远程模式核心特点外网访问能力与主机通信能力典型应用场景桥接模式虚拟机与主机共享物理网卡获取同网段 IP可直接访问外网同一网段可双向通信需对外提供服务时用如搭建 Web 服务器、与其他设备互相访问等NAT 模式虚拟机用私有 IP流量经主机 NAT 转发可访问外网依赖主机 NAT 转发天然互通无需额外配置开发首选如快速联网装环境、主机直连 SSH 等仅主机模式虚拟机连封闭虚拟网卡与外网完全隔离无法访问外网同一虚拟网络可双向通信本地隔离测试如单机服务调试、数据不对外的开发环境等自定义模式指定 VMnet1/8/0灵活配网络取决于所选虚拟网络取决于所选虚拟网络复杂场景如多虚拟网卡协同、特定协议模拟等LAN 区段多虚拟机连专属虚拟网卡区段外无法访问默认无法访问外网默认无法通信模拟复杂网络如多虚拟机模拟服务器集群测试内部通信等日常开发(尤其是个人/常规项目开发)中NAT 模式和桥接模式因适配开发需求、配置简单使用频率远高于其他模式仅主机、自定义、LAN 区段模式受场景限制很少在常规开发流程中用到;对比维度NAT 模式桥接模式网络原理虚拟机借主机网络“转发”上网类似连热点虚拟机与主机平级连物理网络类似插网线IP配置自动分配无需手动需手动设同网段 IP易冲突联网复杂度选模式即联网零配置需配 IP / 网关 / DNS易出错VS Code远程连接天然互通填 IP 直连需确保 IP 同网段且不冲突开发适配场景首选日常写代码、装环境、远程开发需对外提供服务如虚拟机搭网站供手机访问安全隔离性虚拟机藏于主机内网防外部干扰暴露在物理网络易被局域网设备访问NAT网段计算在 VMware 虚拟机环境中NAT 模式的网段由宿主机虚拟网卡(VMnet8)的网络配置决定NAT网段计算• 定位虚拟网卡查看 Windows 主机中 VMware Network Adapter VMnet8 的网络属性• 获取关键参数获取 IP 地址及子网掩码• 计算网段地址网段 虚拟网卡IP 按位与() 子网掩码以 192.168.159.1/24 网段为例(子网掩码 255.255.255.0)整个网段的 IP 范围为 192.168.159.0 ~192.168.159.255 但需严格区分可用主机地址与特殊地址• 可用主机地址192.168.159.3 ~ 192.168.159.254(共252个可用地址),这些地址未被系统占用可安全分配给虚拟机作为静态 IP• 特殊地址特殊地址不可进行分配地址用途说明能否给虚拟机(Ubuntu)用192.168.159.0网段标识地址不能纯标识网段用192.168.159.1宿主机虚拟网卡地址VMnet8不能已被主机占用冲突必断网192.168.159.2NAT 网关地址转发流量用不能已被系统占用不能分配192.168.159.255广播地址给全网段发消息不能用了会导致网段内设备混乱配置 Ubuntu NAT 联网流程确认Windows环境 NAT 网段在Windows操作系统中借助VMware虚拟网络适配器(VMnet8)相关设置查询并记录 NAT 模式下的网段信息(含 IP 地址、子网掩码等)为后续Ubuntu配置提供网络参数依据Ubuntu系统网络配置• 选定网络模式将 Ubuntu 网络连接模式指定为 NAT 模式使虚拟机可借助主机网络转发机制访问外部网络• 配置静态IP地址需确保配置的静态IP地址处于 Windows 端得到的 NAT 网段可用范围内保证网络通信正常• 验证静态 IP 配置通过查看网络信息指令(ip addr)检查静态 IP 地址是否生效、网络参数是否正确等等确保 Ubuntu 可正常上网配置Ubuntu SSH免密登录流程更新软件源同步系统软件源信息确保后续安装软件版本最新sudo apt updateSSH服务部署• 安装 OpenSSH 服务为远程连接提供基础支持sudo apt install openssh-server• 启动 SSH 服务启动服务使 Ubuntu 具备接收 SSH 连接的能力sudo systemctl start ssh• 设置开机自启动配置服务开机自动启动避免系统重启后需手动启动sudo systemctl enable ssh• 验证服务状态检查服务运行状态确保服务正确启动(状态显示active(running)为正常)sudo systemctl status ssh生成密钥对分别在 Windows 和 Ubuntu 系统生成 SSH 密钥对(用于加密认证)• Windows 端打开命令提示符执行以下命令生成密钥对ssh-keygen• Ubuntu 端打开终端执行以下命令生成密钥对ssh-keygen公钥互信配置• 新建授权文件( Ubuntu 端)用于存储公钥文件名固定touch ~/.ssh/authorized_keys• 追加 Windows 公钥Windows 系统生成的公钥文件粘贴到 Ubuntu 系统的新建授权文件中• 追加 Ubuntu 公钥将自身公钥也追加到授权文件实现双向免密(可选按需配置)网络连通性验证与远程登录• ping 测试在 Windows 命令提示符中执行以下命令测试与 Ubuntu 系统的网络连通性ping Ubuntu的IP地址• SSH 远程登录若网络连通执行以下命令通过 SSH 登录 Ubuntu 系统首次登录需输入 yes 确认完成认证后即可进入 Ubuntu 主目录实现免密远程访问ssh Ubuntu用户名Ubuntu的IP地址linux操作系统分层结构IO介绍IO概述IO(Input/Output)是计算机系统中数据在不同实体间传输交互的抽象过程涵盖程序与外部设备(如文件、硬件、网络)的数据读写行为。本质上它是程序与外部环境建立“数据通道”的核心机制支撑着程序获取输入、输出结果的基本逻辑是软件与硬件、本地与远程交互的底层依托IO作用IO 是程序与外部环境交互的基础桥梁。一方面它为程序提供 “输入” 能力支撑程序从文件、硬件、网络获取运行所需的数据(如游戏加载资源文件、程序读取用户输入)另一方面通过 “输出” 功能程序可将计算结果持久化存储(如写入日志文件)、可视化展示(如输出到终端)或远程传输(如网络数据发送)IO种类可从实现层级和应用场景两个维度分类• 按实现层级分类• 系统调用IO也称之为文件IO直接对接操作系统内核的最底层接口逻辑极简、性能接近硬件但是需要手动处理缓冲区、错误码等细节• 库函数IO也称之为标准IO基于系统调用封装的高层接口自动管理缓冲区、跨平台兼容、简化开发是用户态程序的常用选择;按应用场景分类• 文件 IO针对磁盘文件的读写(如日志记录、配置文件操作).可通过“系统调用”或“库函数”实现;• 设备 IO与硬件设备交互(如键盘输入、显示器输出).操作系统通过“设备抽象”将设备转换为文件系统中的特殊文件使程序能用统一的文件操作接口访问所有硬件这正是 Linux“一切皆文件”理念的核心• 网络 IO实现网络数据收发(如浏览器访问网页、APP通讯).依赖系统调用或者是更高层的框架对比维度系统调用库函数层级定位操作系统内核提供的底层接口如open基于系统调用 / 纯用户逻辑封装的高层工具如 C 标准库fopen运行空间运行于内核空间需切换 CPU 特权级用户态 → 内核态运行于用户空间无需特权级切换功能本质直接操作硬件 / 内核资源如读写磁盘、创建进程① 封装系统调用实现复杂功能如printf调用write② 纯用户态逻辑如strlen计算字符串长度性能开销因“用户态 ↔ 内核态”切换开销较大① 若封装系统调用开销略低减少切换次数② 纯用户态函数开销极小移植性依赖操作系统内核移植性差如 Linux 与 Windows 系统调用不同跨平台库如 C 标准库移植性好同一函数适配多系统标准IO介绍定义标准 I/O 是 C 库提供的输入输出函数集合由 ANSI C 标准统一规范为跨平台 IO 操作奠定基础跨平台性在UNIX 系统、Windows系统、Linux 等多系统操作均实现标准 I/O 库让代码跨平台开发更顺畅高效实现原理通过缓冲机制(内存临时存储数据)减少直接系统调用次数降低硬件交互开销提升 IO效率易用性设计基于系统底层调用封装屏蔽复杂硬件操作开发者无需关注设备细节简单调用函数即可完成 IO流(stream)定义所有 I/O 操作抽象为字节的“移入/移出”程序的过程这种字节流动形态称为流。分类• 文件流按字符编码(如 ASCII、UTF-8)处理注重文本语义• 二进制流直接操作原始字节保留数据原始形态(如图片、可执行文件)默认打开的流• stdin标准输入流(如键盘输入)• stdout标准输出流(如屏幕打印)• stderr标准错误流(专用于输出错误信息)FILE对象定义FILE 对象是一个结构体用于存储文件或流相关的所有状态信息(如文件描述符、缓冲区大小、缓冲区当前位置、文件结束标志等等)FILE对象与流对应关系• 每个流在内存中由一个 FILE 对象表示通过 FILE* 指针访问标准流的特殊 FILE 对象• stdin是标准输入流对应的 FILE 对象指针通常关联到键盘输入• stdout是标准输出流对应的 FILE 对象指针通常关联到控制台输出• stderr是标准错误流对应的 FILE 对象指针。通常关联到控制台用于输出错误信息由于 FILE 对象通常较大且内部结构复杂标准 I/O 函数不直接操作FILE对象本身而是通过FILE 指针(FILE*)来间接访问。FILE 指针是指向 FILE 对象的内存地址所有文件操作如打开、读写、关闭都基于这个指针进行FILE指针创建与销毁通过fopen( )进行创建FILE指针通过fclose( )进行销毁FILE指针FILE指针操作所有标准 I/O 函数都以 FILE 指针作为参数常见操作包括读写操作、定位操作、错误检查等等FILE 对象与底层系统调用的关系FILE 对象是标准库层面的抽象而 Linux 内核通过文件描述符如 0、1、2 对应标准输入 / 输出 / 错误管理文件。FILE 对象内部维护了一个文件描述符将标准 I/O 函数映射到底层系统调用如 read()、write()并提供缓冲区优化系统头文件tags生成及vim验证为系统头文件(/usr/include)生成tags索引让vim可快速跳转、检索头文件中的函数、类型、宏等man手册使用方式man手册是用于在linux系统中查询命令、函数等的帮助手册不同的章节分类便于快速定位获取各类linux系统相关的帮助信息以下是一些常用用法• man man查看man手册自身的章节说明了解man手册整体架构和使用规范• man 1 要查看的内容查看可执行程序或shell命令的帮助文档“1”对应用户命令章节• man 2 要查看的内容查看系统调用(内核提供的函数)相关帮助“2”对应系统调用章节• man 3 要查看的内容查看库调用(库中的函数)“3”对应库函数章节......fopen函数项目详细说明所需头文件#include stdio.h原型FILE *fopen(const char *pathname, const char *mode);功能用标准 I/O 的方式打开文件参数pathname文件路径和名字。不写路径默认打开当前路径下的文件。mode打开文件的方式-r只读光标定位到文件开头文件不存在则报错。-r读写光标定位到文件开头文件不存在则报错。-w只写文件存在则清空不存在则创建光标定位到开头。-w读写文件存在则清空不存在则创建光标定位到开头。-a追加只写文件不存在则创建存在则不清空光标定位到结尾。-a读和追加文件不存在则创建存在则不清空读操作时光标在文件开头写操作总是在文件结尾。返回值成功返回FILE指针失败返回NULL并设置错误码fclose函数项目内容所需头文件#include stdio.h原型int fclose(FILE *stream);功能用标准IO的方式关闭文件参数stream文件指针返回值成功返回0失败返回EOF-1并重置错误码错误码的原理在Linux系统中内核通过预定义宏(如 ENOENT)标识错误错误码为正整数内核返回时用负数传递错误码转换为错误信息-strerror函数项目内容所需头文件#include string.h原型char *strerror(int errnum);功能将错误码转换为错误信息参数errnum错误码返回值成功返回指向错误信息的字符串指针若errnum无效返回结果由系统实现决定通常返回通用错误描述如Unknown error nnn错误信息打印函数-perror函数项目内容所需头文件#include stdio.h原型void perror(const char *s);功能打印错误信息。如果s不为NULL且*s不为空字节\0则先打印参数字符串s后跟一个冒号和一个空格然后打印与当前errno值对应的错误消息和一个换行符。参数s用户的附加信息。• 若s非空s ! NULL且*s ! \0则输出s:字符串 冒号 空格。• 若s为空s NULL或*s \0则不同系统可能输出“: 错误信息”或直接输出“错误信息”。返回值无voidfgetc函数项目内容所需头文件#include stdio.h原型int fgetc(FILE *stream);功能从文件流中读取当前位置的字符。每次调用fgetc会自动移动文件指针指向下一个字符位置为后续读取做准备。参数stream文件指针返回值成功返回无符号字符unsigned char的数值范围 0~255并转换为int返回。若返回char255unsigned char会被视为 -1signed char与EOF冲突。失败或读到文件结束返回EOF-1。fputc函数项目内容所需头文件#include stdio.h原型int fputc(int c, FILE *stream);功能向文件中写入一个字符参数c要写入的字符stream文件指针返回值成功返回写入的字符的ASCII码失败返回EOFfgets函数项目内容所需头文件#include stdio.h原型char *fgets(char *s, int size, FILE *stream);功能从stream指向的文件中读取字符串存入s指向的缓冲区最多读取size-1个字符包含可能的换行符\n自动在末尾添加\0遇到 EOF 或\n时停止若因\n停止则\n也会被存入s。参数-s存放读取内容的内存首地址-size想要读取的字节数-stream文件指针返回值- 成功返回s即读取到的字符串地址- 失败或读到文件结束返回NULLfputs函数项目内容所需头文件#include stdio.h原型int fputs(const char *s, FILE *stream);功能将字符串s的内容写入到stream指向的文件中仅写入字符串有效字符不包含末尾\0参数s要写入字符串的首地址stream文件指针返回值成功返回非负整数失败返回EOF-1
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2523549.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!