当前位置: 首页 > news >正文

基于Linux的文件操作(socket操作)

基于Linux的文件操作(socket操作)

  • 1. 文件描述符
  • 基本概念
    • 文件描述符的定义:
    • 标准文件描述符:
    • 文件描述符的分配:
  • 2. 文件描述符操作
    • 打开文件
    • 读取文件中的数据

在linux中,socket也被认为是文件的一种,因此在网络数据传输过程中自然可以使用文件I/O的相关函数。

而在Windows中,是要区分socket和文件的,所以在Windows中需要特殊的数据传输相关的函数。

1. 文件描述符

文件描述符(File Descriptor,简称 FD)是操作系统内核用来管理和访问文件的抽象概念。它是一个非负整数,标识每个进程中已打开的文件、套接字等资源。以下是对文件描述符相关知识的总结:

基本概念

文件描述符的定义:

  • 文件描述符是一个整数,代表一个已经打开的文件或其他输入/输出资源(如套接字、管道等)。
  • 每个进程都有自己独立的文件描述符表。

标准文件描述符:

  • 标准输入(stdin):文件描述符 0,通常关联到键盘输入。
  • 标准输出(stdout):文件描述符 1,通常关联到屏幕输出。
  • 标准错误(stderr):文件描述符 2,通常关联到错误信息输出。

文件描述符的分配:

  • 当进程打开一个新的文件时,系统分配下一个未使用的最小整数作为文件描述符,从 3 开始递增。
  • 例如,标准输入、输出和错误分别占用了文件描述符 012,第一个打开的文件会被分配文件描述符 3

2. 文件描述符操作

打开文件

使用 open 系统调用打开文件并返回文件描述符

#include <fcntl.h>int open(const char *pathname, int flags);
  • pathname:指向要打开的文件路径的字符串。
  • flags:一个整数值,用于指定文件的打开模式和访问模式。常用的标志有:

O_RDONLY:以只读模式打开文件。
O_WRONLY:以只写模式打开文件。
O_RDWR:以读写模式打开文件。
O_CREAT:如果文件不存在,则创建它。
O_EXCL:与 O_CREAT 一起使用,如果文件已存在,则返回错误。
O_TRUNC:如果文件存在,并且以写模式打开,则将文件长度截断为 0。
O_APPEND:以追加模式打开文件,写操作将追加到文件的末尾。

返回值:

  • 成功时,open 返回文件描述符(一个非负整数)。
  • 失败时,open 返回 -1,并设置 errno 以指示错误类型。

示例:(代码来自TCP/IP网络编程 尹圣雨(韩)p10)

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>void error_handling(char *message);int main(void)
{int fd;char buf[] = "Let's go!\n";fd = open("data.txt", O_CREAT | O_WRONLY | O_TRUNC);if (fd == -1)error_handling("open() error!");printf("file descriptor: %d \n", fd);if (write(fd, buf, sizeof(buf)) == -1)error_handling("write() error!");close(fd);return 0;
}void error_handling(char *message)
{fputs(message, stderr);fputc('\n', stderr);exit(1);
}

代码解析:

  • int fd;:定义一个文件描述符变量 fd。

  • char buf[100];:定义一个字符数组 buf,用于存储从文件中读取的数据。

  • fd = open(“data.txt”, O_RDONLY);:打开 data.txt 文件,以只读模式(O_RDONLY)打开。

  • 如果 open 函数返回 -1,表示打开文件失败,调用 error_handling 函数输出错误信息并终止程序。

  • printf(“file descriptor: %d \n”, fd);:输出文件描述符 fd。

  • if (read(fd, buf, sizeof(buf)) == -1):从文件中读取数据到 buf 中。

  • read 函数返回读取的字节数,如果返回 -1,表示读取失败,调用 error_handling 函数输出错误信息并终止程序。

  • printf(“file data: %s”, buf);:输出读取到的数据。

  • close(fd);:关闭文件描述符 fd。

fd = open("data.txt", O_CREAT | O_WRONLY | O_TRUNC);

代表文件打开模式,目录下无data.txt,所以将创建空文件,并只能写

if (write(fd, buf, sizeof(buf)) == -1)

向对应的fd中保存的文件描述符的文件传输buf中保存的数据

  • 在linux下运行结果:
    在这里插入图片描述

读取文件中的数据

#include <unistd.h>ssize_t read(int fd, void *buf, size_t count);

此函数定义中,size_t 是通过 typedef 声明的 unsigned int 类型,对于 ssize_t 来说,size_t 前面多加的 s 代表 signed,即 ssize_t 是通过 typedef 声明的 signed int 类型

参数解释:

  • fd:文件描述符,表示要读取的打开文件。它是通过之前的 open 函数或其他函数(如 pipe)获得的。
  • buf:指向一个缓冲区的指针,读取的数据将被存储在这个缓冲区中。
  • count:要读取的字节数,指定从文件中最多读取多少字节的数据到缓冲区 buf 中。

返回值:

  • 成功时,返回读取的字节数(类型为 ssize_t),这可能小于 count,如果遇到文件结尾(EOF)。
  • 如果返回值是 0,表示已到达文件结尾。
  • 失败时,返回 -1,并设置 errno 以指示具体的错误类型。

代码示例:

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>void error_handling(char *message);int main(void)
{int fd;char buf[100];fd = open("data.txt", O_RDONLY);if (fd == -1)error_handling("open() error!");printf("file descriptor: %d \n", fd);if (read(fd, buf, sizeof(buf)) == -1)error_handling("read() error!");printf("file data: %s", buf);close(fd);return 0;
}void error_handling(char *message)
{fputs(message, stderr);fputc('\n', stderr);exit(1);
}

代码解释:

  • int fd;:定义一个文件描述符变量 fd。

  • char buf[100];:定义一个字符数组 buf,用于存储从文件中读取的数据。

  • fd = open(“data.txt”, O_RDONLY);:打开 data.txt 文件,以只读模式(O_RDONLY)打开。

  • 如果 open 函数返回 -1,表示打开文件失败,调用 error_handling 函数输出错误信息并终止程序。

  • printf(“file descriptor: %d \n”, fd);:输出文件描述符 fd。

  • if (read(fd, buf, sizeof(buf)) == -1):从文件中读取数据到 buf 中。

  • read 函数返回读取的字节数,如果返回 -1,表示读取失败,调用 error_handling 函数输出错误信息并终止程序。

  • printf(“file data: %s”, buf);:输出读取到的数据。

  • close(fd);:关闭文件描述符 fd。

以上为文件描述符的I/O操作相关的介绍,该内容同样适用于套接字

相关文章:

基于Linux的文件操作(socket操作)

基于Linux的文件操作&#xff08;socket操作&#xff09; 1. 文件描述符基本概念文件描述符的定义&#xff1a;标准文件描述符&#xff1a;文件描述符的分配&#xff1a; 2. 文件描述符操作打开文件读取文件中的数据 在linux中&#xff0c;socket也被认为是文件的一种&#xff…...

C++面试题记录(网络)

TCP与UDP区别 1. TCP面向连接&#xff0c;UDP无连接&#xff0c;所以UDP数据传输效率更高 2.UDP可以支持一对一、一对多、多对一、多对多通信&#xff0c;TCP只能一对一 3. TCP需要在端系统维护连接状态&#xff0c;包括缓存&#xff0c;序号&#xff0c;确认号&#xff0c;…...

YoloV8改进策略:卷积篇|基于PConv的二次创新|附结构图|性能和精度得到大幅度提高(独家原创)

摘要 在PConv的基础上做了二次创新,创新后的模型不仅在精度和速度上有了质的提升,还可以支持Stride为2的降采样。 改进方法简单高效,需要发论文的同学不要错过! 论文指导 PConv在论文中的描述 论文: 下面我们展示了可以通过利用特征图的冗余来进一步优化成本。如图3所…...

图论(从数据结构的三要素出发)

文章目录 逻辑结构物理结构邻接矩阵定义性能分析性质存在的问题 邻接表定义性能分析存在的问题 十字链表(有向图)定义性能分析 邻接多重表(无向图)定义性能分析 数据的操作图的基本操作图的遍历广度优先遍历&#xff08;BFS&#xff09;算法思想和实现性能分析深度优先最小生成…...

spark相关知识

1.Spark的特点 Spark的设计遵循“一个软件栈满足不同应用场景”的理念&#xff0c;逐渐形成了一套完整的生态系统&#xff0c;既能够提供内存计算框架&#xff0c;也可以支持SQL即席查询、实时流式计算、机器学习和图计算等。 运行速度快&#xff0c;易使用&#xff0c;强大的技…...

K8S认证|CKA题库+答案| 12. 查看Pod日志

目录 12、查看Pod日志 CKA v1.29.0模拟系统 下载试用 题目&#xff1a; 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、提取错误日志 3&#xff09;、验证提取结果 12、查看Pod日志 CKA v1.29.0模拟系统 下载试用 题目&#xff1a; 您必须在以下C…...

【Java SE】 String、StringBuff和StringBuilder

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. 字符串不可变性1.1 设计不可变1.2 修改字符串创建新对象1.3 为什么字符串不可变1.4 String类设计不可变的…...

产品经理-需求分析(三)

1. 需求分析 从业务的需要出发&#xff0c;确定业务目的和目标&#xff0c;将业务需求转为产品需求 1.1 业务需求 业务需求 业务动机 业务目标 就是最根本的动机和目标成果&#xff0c;通过这个需求解决特定的问题 1.2 产品需求 产品需求 解决方案 产品结构 产品流程…...

Linux 编译器gcc/g++使用

gcc/g同理 编译器运行过程 1. 预处理&#xff08;进行宏替换) gcc -E a.c -o a.i 预处理后还是c语言 -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面 告诉gcc&#xff0c;从现在开始进行程序的翻译&#xff0c;将预处理工作做完停下 2. 编译&#x…...

adam优化器计算过程(tensorflow)

一、adam原理 原理 应用 优点 缺点 二、手动实现 一步一步计算 三、使用tensorflow api实现 api使用 四、一个具体的深度学习的例子...

【数据结构与算法 | 链表篇】力扣876

1. 力扣876 : 链表的中间节点 (1). 题 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5] 解释&#xff1a;链表…...

kubeadm引导欧拉系统高可用的K8S1.28.X

文章目录 一. 核心组件架构二. 有状态与无状态应用三. 资源对象3.1 规约与状态3.2 资源的分类-元数据,集群,命名空间3.2.1 元数据3.2.2 集群资源 3.3 命名空间级3.3.1 pod3.3.2 pod-副本集3.3.3 pod-控制器 四. Kubeadm安装k8s集群4.1 初始操作4.2 ~~所有节点安装Docker&#x…...

【信息学奥赛】字典的键和值对换

【信息学奥赛】字典的键和值对换 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 输入一个字典&#xff0c;要求将该字典的键和值对换。&#xff08;注意&#xff0c;字典中有键的值是重复的&#xff09; 输入&#xff1a; 一行&#xff0…...

使用Django框架搭建Web应用

文章目录 简介安装Django创建一个Django项目创建一个Django应用编写视图配置URL运行开发服务器总结与拓展数据库集成管理后台表单处理模板引擎安全性 简介 Django 是一款基于 Python 语言的开源 Web 应用框架&#xff0c;采用了 MVC&#xff08;模型-视图-控制器&#xff09;设…...

我用Mybatis的方式封装了OLAP查询!

背景 相信做数据平台的朋友对OLAP并不陌生&#xff0c;主流的OLAP引擎有Clickhouse&#xff0c;Impala&#xff0c;Starrocks…以及公司二开的OLAP平台&#xff0c;本次要说的OLAP属于最后一种。 最近在做一个BI项目&#xff0c;业务背景很简单&#xff0c;就是一个数据展示平…...

golang rune类型解析,与byte,string对比,以及应用

Golang中的rune类型是一个32位的整数类型(int32)&#xff0c;它是用来表示Unicode码点的。rune类型的值可以是任何合法的Unicode码点&#xff0c;它通常用来处理字符串中的单个字符。 在Golang中&#xff0c;字符常量使用单引号来表示&#xff0c;例如 a。使用单引号表示的字符…...

重学java 51.Collections集合工具类、泛型

"我已不在地坛&#xff0c;地坛在我" —— 《想念地坛》 24.5.28 一、Collections集合工具类 1.概述:集合工具类 2.特点: a.构造私有 b.方法都是静态的 3.使用:类名直接调用 4.方法: static <T> boolean addAll(collection<? super T>c,T... el…...

多语言印度红绿灯系统源码带三级分销代理功能

前端为2套UI&#xff0c;一套是html写的&#xff0c;一套是编译后的前端 后台功能很完善&#xff0c;带预设、首充返佣、三级分销机制、代理功能。 东西很简单&#xff0c;首页就是红绿灯的下注页面&#xff0c;玩法虽然单一&#xff0c;好在不残缺可以正常跑。...

HTML拆分与共享方式——多HTML组合技术

作者:私语茶馆 1.应用场景 如果是一个产品级的Web项目,往往非常多的页面部分是重复的(为保持风格一致),每个HTML页面将这些重复部分重新写一次,既带来极大的工作量,也造成后续修改不便。 因此会考虑到将一个HTML的不同部分拆分为多个HTML页面,利用类似Include方式包含…...

K8s集群之 存储卷 PV PVC

目录 默写 1 如何将pod创建在指定的Node节点上 2 污点的种类(在node上设置) 一 挂载存储​​​​​​​ 1 emptyDir存储卷 2 hostPath存储卷 ①在 node01 节点上创建挂载目录 ② 在 node02 节点上创建挂载目录 ③ 创建 Pod 资源 ④ 在master上检测一下&#xff1a;…...

Retinaface+CurricularFace模型在智能门禁系统中的实战应用

RetinafaceCurricularFace模型在智能门禁系统中的实战应用 1. 引言 想象一下这样的场景&#xff1a;每天早晨上班高峰期&#xff0c;办公楼入口排着长队等待刷卡进门&#xff1b;访客需要在前台登记身份证&#xff0c;保安还要手动核对信息。这种传统门禁方式不仅效率低下&am…...

5分钟部署阿里RexUniNLU:Web界面操作,无需编程基础

5分钟部署阿里RexUniNLU&#xff1a;Web界面操作&#xff0c;无需编程基础 1. 认识RexUniNLU&#xff1a;零样本理解的神器 想象一下&#xff0c;你刚接手一个新项目&#xff0c;老板丢给你一堆用户评论&#xff0c;要求你快速分析出大家对产品"屏幕"、"续航&…...

基于vue的错题管理系统[vue]-计算机毕业设计源码+LW文档

摘要&#xff1a;随着在线教育的发展&#xff0c;错题管理作为学习过程中的重要环节&#xff0c;其信息化管理需求日益增长。本文旨在设计并实现一个基于Vue框架的错题管理系统&#xff0c;通过对系统需求进行深入分析&#xff0c;采用合适的技术架构和开发技术&#xff0c;完成…...

忍者像素绘卷:天界画坊Python入门实战,3步搭建AI绘画环境

忍者像素绘卷&#xff1a;天界画坊Python入门实战&#xff0c;3步搭建AI绘画环境 1. 前言&#xff1a;当Python遇见像素艺术 还记得小时候玩过的8-bit游戏吗&#xff1f;那些由一个个小方块组成的像素世界&#xff0c;如今正以全新的方式回归。天界画坊是一个开源的AI绘画工具…...

别再手写表单了!用Vue3+AI做个自己的低代码设计器,5分钟搞定一个页面

用Vue3AI打造个人专属低代码表单设计器&#xff1a;5分钟解放重复劳动 如果你是一名中后台开发者&#xff0c;每天被各种CRUD表单折磨得焦头烂额&#xff0c;这篇文章就是为你准备的。想象一下&#xff1a;当你接到第100个类似的用户管理表单需求时&#xff0c;不再需要从零开始…...

告别僵硬数字人:用InfiniteTalk V2的WebUI,让照片开口唱歌(保姆级参数设置指南)

告别僵硬数字人&#xff1a;用InfiniteTalk V2的WebUI&#xff0c;让照片开口唱歌&#xff08;保姆级参数设置指南&#xff09; 当一张静态照片突然流畅地唱起你上传的歌曲&#xff0c;嘴角弧度与歌词节奏完美匹配&#xff0c;甚至伴随旋律自然摆动头部——这种魔法般的体验&am…...

快速原型构建遇阻?用快马AI一键绕过npm error 128,聚焦核心功能验证

最近在尝试用Node.js快速验证一个Web服务原型时&#xff0c;遇到了烦人的npm error code 128问题。这个错误通常和Git仓库权限相关&#xff0c;会直接卡住依赖安装流程。经过一番折腾&#xff0c;我总结出一套在InsCode(快马)平台快速绕开这个坑的实践方案&#xff0c;分享给同…...

终极网盘下载加速方案:3分钟解锁八大平台极速下载

终极网盘下载加速方案&#xff1a;3分钟解锁八大平台极速下载 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘…...

理视康新零售系统开发要点

业务模式设计新零售模式需整合线上线下渠道&#xff0c;构建会员体系、分销机制与数据中台。通过小程序、APP或H5实现线上商城&#xff0c;线下门店采用智能硬件&#xff08;如AR试戴、智能货架&#xff09;提升体验。结合LBS技术实现附近门店导流&#xff0c;支持到店自提或同…...

SIFT算法二十年:为什么它仍是图像匹配的‘老兵’?对比ORB、SURF与深度学习特征

SIFT算法二十年&#xff1a;为什么它仍是图像匹配的‘老兵’&#xff1f; 在计算机视觉领域&#xff0c;特征提取与匹配一直是核心问题之一。从早期的传统算法到如今的深度学习模型&#xff0c;技术迭代层出不穷。然而&#xff0c;在这股浪潮中&#xff0c;SIFT&#xff08;Sca…...