【linux编程】linux文件IO的系统函数(close/read/fcntl/dup/dup2)

close函数

  • 函数原型:
#include <unistd.h>
int close(int fd);
  • 参数:fd:要关闭的文件描述符

  • 返回值:成功返回0,失败返回-1并设置errno

  • 功能:关闭一个已经打开的文件,释放相关的资源。在Linux中,文件包括普通文件,目录,设备文件,管道,套接字等。每个打开的文件都有一个唯一的文件描述符,用来标识该文件。当不再需要使用一个文件时,应该调用close函数来关闭文件,否则可能会导致资源泄露,文件被占用,或者达到打开文件的上限。close函数会将文件描述符和文件表项的关联解除,如果该文件表项的引用计数变为0,表示没有其他文件描述符指向该文件,那么该文件表项也会被释放。如果该文件是一个套接字,那么close函数还会发送一个FIN包给对方,表示结束通信。close函数通常会在文件操作完成后调用,或者在程序退出前调用。

  • 代码示例:打开一个名为test.txt的文件,读取文件内容,然后关闭文件。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>int main()
{int fd; //定义一个文件描述符char buffer[100]; //定义一个缓冲区fd = open("test.txt", O_RDONLY); //以只读方式打开文件if (fd == -1) //判断文件是否打开成功{perror("open"); //打印错误信息exit(1); //退出程序}read(fd, buffer, 10); //从文件中读取10个字节到缓冲区printf("读取的数据是: %s\n", buffer); //打印缓冲区内容close(fd); //关闭文件return 0;
}

read函数

函数原型:

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

参数:

  • fd:要读取的文件的描述符
  • buf:指定的缓冲区的地址
  • count:指定的要读取的字节数

返回值:

实际读取的字节数,如果出错则返回-1并设置errno,如果到达文件末尾则返回0

功能:

从一个打开的文件中读取数据,将数据存储到指定的缓冲区中。read函数通常会从文件的当前偏移量处开始读取数据,并使偏移量增加读取的字节数。如果读取的字节数小于指定的字节数,可能是因为到达文件末尾,或者遇到了中断,或者读取的是一个管道或套接字等非常规文件。

代码示例:

打开一个名为test.txt的文件,读取10个字节的数据到缓冲区,并打印出来。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>int main()
{int fd; //定义一个文件描述符char buffer[100]; //定义一个缓冲区fd = open("test.txt", O_RDONLY); //以只读方式打开文件if (fd == -1) //判断文件是否打开成功{perror("open"); //打印错误信息exit(1); //退出程序}read(fd, buffer, 10); //从文件中读取10个字节到缓冲区printf("读取的数据是: %s\n", buffer); //打印缓冲区内容close(fd); //关闭文件return 0;
}

fcntl函数

函数原型:

#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* arg */ );

参数:

  • fd:要操作的文件的描述符
  • cmd:要执行的控制命令
  • arg:可选的,根据不同的命令有不同的含义

fcntl函数支持的控制命令有很多,这里只介绍一些常用的,更多的可以参考[fcntl(2)的手册页]:

F_DUPFD:复制文件描述符fd,并返回一个新的文件描述符,该描述符的值是大于或等于arg的最小值。新的文件描述符和原来的文件描述符共享同一个文件表项,但是有自己的文件描述符标志,且默认设置为FD_CLOEXEC。这个命令相当于dup函数的功能,但是可以指定新的文件描述符的最小值。

F_GETFD:获取文件描述符fd的文件描述符标志,返回该标志的值。目前只有一个标志FD_CLOEXEC,表示在执行exec类函数时,关闭该文件描述符。

F_SETFD:设置文件描述符fd的文件描述符标志,arg参数是要设置的标志的值。目前只能设置FD_CLOEXEC标志。

F_GETFL:获取文件描述符fd的文件状态标志,返回该标志的值。文件状态标志包括文件的访问模式(O_RDONLY,O_WRONLY,O_RDWR)和文件的打开方式(O_APPEND,O_NONBLOCK,O_SYNC等)。

F_SETFL:设置文件描述符fd的文件状态标志,arg参数是要设置的标志的值。注意,只能改变文件打开方式的标志,不能改变文件的访问模式。

F_GETLK,F_SETLK,F_SETLKW:这些命令用来获取、设置或释放文件的记录锁。arg参数是一个指向struct flock结构体的指针,该结构体定义了锁的类型、起始位置、长度和持有者等信息。F_GETLK命令用来检测是否能够对文件加上指定的锁,如果能够加锁,返回0,如果不能加锁,返回-1并设置errno为EACCES或EAGAIN,并且将arg指向的结构体填充为已存在的锁的信息。F_SETLK命令用来对文件加上或释放指定的锁,如果能够加锁或解锁,返回0,如果不能加锁或解锁,返回-1并设置errno为EACCES或EAGAIN。F_SETLKW命令和F_SETLK命令类似,但是如果不能立即加锁或解锁,会阻塞直到能够完成操作或被信号中断。文件的记录锁可以用来实现对文件的互斥访问或协调访问,更多的细节可以参考[文件锁的手册页]。

返回值:根据不同的命令有不同的含义,一般来说,成功时返回非负值,失败时返回-1并设置errno功能:对已经打开的文件进行各种控制操作,比如改变文件的访问模式,获取或设置文件的状态标志,获取或设置文件的锁等。

代码示例:打开一个名为test.txt的文件,获取其文件状态标志,将其设置为非阻塞模式,然后复制一个新的文件描述符,该描述符的值不小于10。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>int main()
{int fd; //定义一个文件描述符int flag; //定义一个文件状态标志int fd2; //定义一个新的文件描述符fd = open("test.txt", O_RDWR); //以读写方式打开文件if (fd == -1) //判断文件是否打开成功{perror("open"); //打印错误信息exit(1); //退出程序}flag = fcntl(fd, F_GETFL); //获取文件状态标志if (flag == -1) //判断是否获取成功{perror("fcntl"); //打印错误信息exit(1); //退出程序}printf("文件状态标志是: %d\n", flag); //打印文件状态标志flag |= O_NONBLOCK; //将文件状态标志设置为非阻塞模式if (fcntl(fd, F_SETFL, flag) == -1) //设置文件状态标志{perror("fcntl"); //打印错误信息exit(1); //退出程序}printf("文件状态标志已设置为非阻塞模式\n"); //打印提示信息fd2 = fcntl(fd, F_DUPFD, 10); //复制文件描述符,指定新的文件描述符的最小值为10if (fd2 == -1) //判断是否复制成功{perror("fcntl"); //打印错误信息exit(1); //退出程序}printf("新的文件描述符是: %d\n", fd2); //打印新的文件描述符//后续的读写操作//...close(fd); //关闭文件close(fd2); //关闭新的文件描述符return 0;
}

dup函数

  • 函数原型:
#include <unistd.h>
int dup(int oldfd);
  • 参数:oldfd:要复制的文件描述符

  • 返回值:新的文件描述符,如果出错则返回-1并设置errno

  • 功能:复制一个文件描述符,并返回一个新的文件描述符,该描述符的值是当前可用的最小值。新的文件描述符和原来的文件描述符共享同一个文件表项,但是有自己的文件描述符标志,且默认设置为FD_CLOEXEC。dup函数相当于调用fcntl函数并传入F_DUPFD命令和0作为arg参数,但是更简洁。dup函数可以用来重定向标准输入、输出或错误,或者创建一个和已有文件描述符功能相同但值不同的文件描述符。

  • 代码示例:打开一个名为test.txt的文件,复制一个新的文件描述符,将标准输出重定向到该文件,然后打印一些信息。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>int main()
{int fd; //定义一个文件描述符int fd2; //定义一个新的文件描述符fd = open("test.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666); //以写入、创建、截断的方式打开文件if (fd == -1) //判断文件是否打开成功{perror("open"); //打印错误信息exit(1); //退出程序}fd2 = dup(fd); //复制文件描述符if (fd2 == -1) //判断是否复制成功{perror("dup"); //打印错误信息exit(1); //退出程序}close(fd); //关闭原来的文件描述符dup2(fd2, STDOUT_FILENO); //将标准输出重定向到新的文件描述符printf("这些信息将被写入到文件中\n"); //打印一些信息printf("新的文件描述符是: %d\n", fd2); //打印新的文件描述符close(fd2); //关闭新的文件描述符return 0;
}

dup2函数

  • 函数原型:
#include <unistd.h>
int dup2(int oldfd, int newfd);
  • 参数:

    • oldfd:要复制的文件描述符
    • newfd:要指定的新的文件描述符
  • 返回值:新的文件描述符,如果出错则返回-1并设置errno

  • 功能:和dup函数类似,也可以用来复制一个文件描述符,并返回一个新的文件描述符,但是可以指定新的文件描述符的值。如果新的文件描述符已经打开,则先关闭它。dup2函数相当于调用close函数和fcntl函数并传入F_DUPFD命令和newfd作为arg参数,但是更简洁。dup2函数也可以用来重定向标准输入、输出或错误,或者创建一个和已有文件描述符功能相同但值不同的文件描述符。

  • 代码示例:打开一个名为test.txt的文件,将标准输出重定向到该文件,然后打印一些信息。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>int main()
{int fd; //定义一个文件描述符fd = open("test.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666); //以写入、创建、截断的方式打开文件if (fd == -1) //判断文件是否打开成功{perror("open"); //打印错误信息exit(1); //退出程序}dup2(fd, STDOUT_FILENO); //将标准输出重定向到文件描述符printf("这些信息将被写入到文件中\n"); //打印一些信息printf("文件描述符是: %d\n", fd); //打印文件描述符close(fd); //关闭文件描述符return 0;
}

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

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

相关文章

最新 vie-vite框架下 jtopo安装使用

官方地址 官方源码 安装下载 1.官方好像都没有给git地址&#xff0c;尝试npm安装报错 2.找到1.0.5之前的版本npm i jtopo2&#xff0c;安装成功后使用报错&#xff0c;应该是版本冲突了 1.本地引入&#xff0c; 点击官方源码下载&#xff0c;需要jtopo_npm文件 2.引入到本…

Jetpack:030-Jetpack中的状态

文章目录 1. 概念介绍2. 使用方法2.1 可监听对象2.2 获取状态值2.3 修改状态值2.4 重组函数 3. 示例代码4. 内容总结 我们在上一章回中介绍了Jetpack中网格布局相关的内容&#xff0c;本章回中主要 介绍状态。闲话休提&#xff0c;让我们一起Talk Android Jetpack吧&#xff0…

【SpringCloud Alibaba -- Nacos】Linux 搭建 Nacos 集群

搭建 Nacos 集群 架构 centos安装docker https://docs.docker.com/engine/install/centos/ 详细配置过程 MySql8 mysql数据库配置 数据库脚本 nacos/conf/nacos-mysql.sql Nacos2 application.properties 修改为mysql spring.datasource.platformmysqldb.num1 db.url…

【工具】Github统计代码行数工具推荐(VScode插件、兼容任何平台、不用下载安装包)

需求&#xff1a; 1&#xff09;被要求统计代码行数&#xff1b; 2&#xff09;不想打开Linux&#xff0c;懒得下载Windows版本GitStats&#xff1b; 3&#xff09;打开了Linux但也不记得find命令行怎么用&#xff1b; 4&#xff09;打开了Linux&#xff0c;装好了Gitstats但自…

wagtail的使用

文章目录 安装虚拟环境新建项目时指定虚拟环境打开已有项目添加虚拟环境 安装wagtail查看安装后的包 创建wagtail项目安装依赖迁移创建超级用户运行项目 管理工作台内容扩展首页的数据模型更新数据库修改模板页创建一个页面的过程 models中的基本字段templates字符型文本字段富…

汽车标定技术(四)--问题分析:多周期测量时上位机显示异常

目录 1.问题现象 2.数据流分析 ​​​​3.代码分析 3.1 AllocDAQ 3.2 AllocOdt 3.3 AllocOdtEntry 4.根因分析及解决方法 4.1 根因分析 4.2 解决方案 1.问题现象 在手撸XCP代码时&#xff0c; DAQ的实现是一大头痛的事情。最初单周期实现还好一点&#xff0c;特别是…

MATLAB - Gazebo 联合仿真 —— 使用 UR10 机械臂检测和采摘水果

系列文章目录 文章目录 系列文章目录前言一、设置 Gazebo 仿真环境二、在 Gazebo 中模拟和控制机器人2.1 概述2.2 任务调度器2.3 感知和目标生成系统2.4 运动规划2.5 机械臂和关节控制系统 三、分配用于控制机器人的参数3.1 定义机器人模型和运动规划参数&#xff0c;3.2 定义机…

OpenCV(应用) —— 目标轮廓的相关应用

文章目录 一、目标轮廓的获取与绘制二、轮廓的信息&#xff08;面积和周长&#xff09;三、轮廓外接形状的三种表达方式 一、目标轮廓的获取与绘制 通常&#xff0c;使用findContours() 函数是为了获取一张图像内目标对象的所有轮廓&#xff0c;并且在 OpenCV4.x 版本中&#…

Python 深度学习导入的一些包的说明

Python 深度学习导入的一些包的说明 这段代码导入了一些Python库和模块&#xff0c;并定义了一些数据转换操作。 from future import print_function, division&#xff1a;这是一个Python 2和Python 3兼容性的导入语句。它确保在Python 2中使用Python 3的print函数和除法运算符…

学习c++的第十一天

目录 继承和派生 基类 & 派生类 访问控制和继承 派生类的构造函数 派生类的析构函数 继承类型 多继承 重载运算符和重载函数 函数重载 运算符重载 可重载运算符/不可重载运算符 运算符重载实例 继承和派生 先来说继承&#xff0c;这与现实生活中的继承意思差不…

[直播自学]-[汇川easy320]搞起来(1)给PLC供电

从没正儿八经的用一用PLC&#xff0c;所以双11在淘宝入手一个EASY320&#xff0c;大概1000出头。 到货后&#xff0c;汇川官网搜了一下资料&#xff0c;搜到这几个&#xff1a; 首先是给PLC供电吧&#xff0c;看了下PLC前面是24V&#xff0c;不知道供电范围多宽&#xff0c;于…

YoloV8目标检测与实例分割——目标检测onnx模型推理

一、模型转换 1.onnxruntime ONNX Runtime&#xff08;ONNX Runtime或ORT&#xff09;是一个开源的高性能推理引擎&#xff0c;用于部署和运行机器学习模型。它的设计目标是优化执行使用Open Neural Network Exchange&#xff08;ONNX&#xff09;格式定义的模型&#xff0c;…

helm一键部署grafana

一键部署命令 helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update helm install prometheus prometheus-community/kube-prometheus-stack暴露服务 kubectl port-forward --address 0.0.0.0 deployment/prometheus-gr…

https原理

首先说一下几个概念&#xff1a;对称加密、非对称加密 对称加密&#xff1a; 客户端和服务端使用同一个秘钥&#xff0c;分两种情况&#xff1a; 1、所有的客户端和服务端使用同一个秘钥&#xff0c;这个秘钥被泄漏后数据不再安全 2、每个客户端生成一个秘钥&…

[云原生案例2.1 ] Kubernetes的部署安装 【单master集群架构 ---- (二进制安装部署)】节点部分

文章目录 1. 常见的K8S安装部署方式1.1 Minikube1.2 Kubeadm1.3 二进制安装部署 2. Kubernetes单master集群架构 ---- &#xff08;二进制安装部署&#xff09;2.1 前置准备2.2 操作系统初始化2.3 部署 docker引擎 ---- &#xff08;所有 node 节点&#xff09;2.4 部署 etcd 集…

重启某个节点、重启电脑服务器后,kubernetes无法运行,k8s无法运行

问题描述 环境&#xff1a;ubuntu18.04 LTS 现象&#xff1a;按步骤安装kubernetes后&#xff0c;正常启动&#xff0c;各个命令均可正常使用。服务器重启后&#xff0c;执行命令错误信息如下&#xff1a; sudo kubectl get nodesThe connection to the server 127.0.0.1:644…

HTML_案例1_注册页面

用纯html页面&#xff0c;不用css画一个注册页面。 最终效果如下&#xff1a; html页面代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>注册页面</title> </head>…

ffmpeg命令帮助文档

一&#xff1a;帮助文档的命令格式 ffmpeg -h帮助的基本信息ffmpeg -h long帮助的高级信息ffmpeg -h full帮助的全部信息 ffmpeg的命令使用方式&#xff1a;ffmpeg [options] [[infile options] -i infile] [[outfile options] outfile] 二&#xff1a;将帮助文档输出到文件 …

部署ELK

一、elasticsearch #拉取镜像 docker pull elasticsearch:7.12.1 #创建ELK docker网络 docker network create elk #启动ELK docker run -d --name es --net elk -P -e "discovery.typesingle-node" elasticsearch:7.12.1 #拷贝配置文件 docker cp es:/usr/share/el…

【2023年MathorCup高校数学建模挑战赛-大数据竞赛】赛道A:基于计算机视觉的坑洼道路检测和识别 python 代码解析

【2023年MathorCup高校数学建模挑战赛-大数据竞赛】赛道A&#xff1a;基于计算机视觉的坑洼道路检测和识别 python 代码解析 1 题目 坑洼道路检测和识别是一种计算机视觉任务&#xff0c;旨在通过数字图像&#xff08;通常是地表坑洼图像&#xff09;识别出存在坑洼的道路。这…