系统IO函数接口
目录
前言
一. man手册
1.1 man手册如何查询
1.2 man手册基础
二.系统IO函数接口
三.open打开文件夹
3.1 例1 open打开文件
3.2 open打开文件代码
3.3 例2 创建文件
四.write写文件
4.1 write写文件
五. read读文件
5.1 read读文件与偏移
5.2 偏移细节
5.3 read读文件代码
六.复制文件
6.1 方法1:cp 命令
6.2 方法2:使用缓冲区拷贝
6.3 方法3:主函数传参
前言
学习使用man手册,系统IO接口:open write read接口
系统I/O接口是一组用于处理输入和输出操作的函数和工具。这些接口提供了与操作系统交互的机制,允许程序读写文件、网络通信、控制设备等。系统I/O接口在C语言程序中扮演着至关重要的角色,以下是它们的一些主要作用:
一. man手册
1.1 man手册如何查询
我们输入man -f open 命令
man -f open
输入man man
可以查看man中的9本手册
1.2 man手册基础
当前第二本手册
函数的功能介绍(使用说明)
返回值介绍
错误号码
二.系统IO函数接口
在C语言中,系统I/O接口是一组用于处理输入和输出操作的函数和工具。这些接口提供了与操作系统交互的机制,允许程序读写文件、网络通信、控制设备等。系统I/O接口在C语言程序中扮演着至关重要的角色,以下是它们的一些主要作用:
文件操作: 系统I/O接口提供了一系列的函数,如
open
、read
、write
、close
等,用于打开、读取、写入和关闭文件。这些函数是进行文件处理的基础,允许程序访问磁盘上的文件资源。数据传输: 通过系统I/O接口,程序可以读写数据流。这包括从标准输入(如键盘)读取数据,以及向标准输出(如终端或文件)写入数据。这些操作对于用户交互和程序输出是必不可少的。
缓冲管理: 系统I/O接口通常使用缓冲区来优化读写操作的性能。例如,
stdio
库中的fread
和fwrite
函数会在内部使用缓冲区来减少对底层read
和write
系统调用的频繁使用。这有助于提高I/O操作的效率。错误处理: 系统I/O接口提供了错误检测和报告机制。当I/O操作失败时,这些接口会设置全局变量
errno
,并返回特定的错误代码。这使得程序员能够诊断和处理I/O操作中出现的问题。设备控制: 系统I/O接口允许程序与各种设备进行交互,如打印机、磁盘驱动器、网络接口等。通过这些接口,程序可以执行设备特定的操作,如打开设备、发送命令、读取状态等。
网络通信: 系统I/O接口提供了网络编程的基础设施,包括套接字(sockets)操作、网络协议处理、数据包发送和接收等。这些接口使得程序能够在网络上进行通信和数据交换。
多线程和异步I/O: 在多线程或异步I/O环境中,系统I/O接口可以支持并发操作,允许多个线程同时进行I/O操作,提高了程序的响应性和性能。
跨平台兼容性: C语言标准库中的I/O接口设计为跨平台兼容,这意味着在不同的操作系统和硬件平台上,程序可以使用相同的I/O函数进行开发。这大大简化了程序的移植和维护工作。
总之,系统I/O接口是C语言程序与外部世界交互的桥梁,它们为程序提供了丰富的输入输出功能,使得程序能够执行文件处理、网络通信、设备控制等多样化的任务。通过有效地使用这些接口,程序员可以构建出功能强大、性能优越的应用程序。
三.open打开文件夹
3.1 例1 open打开文件
头文件
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>
定义函数
int open(const char * pathname, int flags); int open(const char * pathname, int flags, mode_t mode);
参数分析
需要注意:
3.2 open打开文件代码
代码
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <errno.h> #include <string.h>int main(int argc, char const *argv[]) {// 打开文件int file_fd = open("abc.c", O_RDONLY );if( -1 == file_fd ){fprintf( stderr , "open abc.c error , msg:%s\n", strerror(errno));return -1 ;}else{printf("open abc.c succeed , file descriptor : %d \n " , file_fd);}return 0; }
如果没有创建文件,则会显示文件或路径不存在
接着我们创建文件abc.c再进行测试,现在就可以找到文件了
3.3 例2 创建文件
如果文件不存在如何在程序中自行创建
可以先查看umask
当前测试文件夹中的内容为open_1.c
open_1.c代码
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <errno.h> #include <string.h>int main(int argc, char const *argv[]) {// 打开文件int file_fd = open("abc.c", O_RDONLY | O_CREAT | O_TRUNC , 0666 );if( -1 == file_fd ){fprintf( stderr , "open abc.c error , msg:%s\n", strerror(errno));return -1 ;}else{printf("open abc.c succeed , file descriptor : %d \n " , file_fd);}return 0; }
运行结果:可以看出编译a.out后,我们创建了一个名为abc.c的文件
四.write写文件
4.1 write写文件
在文件中写入
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <errno.h> #include <string.h> #include <unistd.h>int main(int argc, char const *argv[]) {// 打开文件int file_fd = open("abc.c", O_RDWR | O_CREAT | O_TRUNC , 0666 );if( -1 == file_fd ){fprintf( stderr , "open abc.c error , msg:%s\n", strerror(errno));return -1 ;}else{printf("open abc.c succeed , file descriptor : %d \n " , file_fd);}// 写入内容ssize_t ret_val = write ( file_fd , "Hello GZ2123", sizeof("Hello GZ2123"));if( -1 == ret_val ){fprintf( stderr , "write abc.c error , msg:%s\n", strerror(errno));return -1 ;}else{printf(" write succeed : %ld byet \n" , ret_val);}while(1){}return 0; }
五. read读文件
5.1 read读文件与偏移
在读取文件中,我们需要注意偏移量的细节
读取文件
移动文件的读写位置(设置偏移量)
5.2 偏移细节
读取文件时,需要注意当前文件的操作:
若打开进行写入操作后没有关闭,那么我们进行读操作时,偏移量会到数据末尾,如这里的null,若在这里进行读取数据,则读不出来:
解决方法:1.把文件关闭再打开,再次被打开时文件的偏移量为开头部分,这是就可以正常读取数据了
close(file_fd); open("abc.c", O_RDWR, 0666 );
解决方法2:设置偏移量:通过直接设置偏移量,即可重现定位到文件的头部分
//把读写位置偏移到开头 ret_val = lseek(file_fd , 0 , SEEK_SET ); printf("偏移后:%ld\n" , ret_val);
5.3 read读文件代码
代码
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <errno.h> #include <string.h> #include <unistd.h>int main(int argc, char const *argv[]) {// 打开文件int file_fd = open("abc.c", O_RDWR | O_CREAT | O_TRUNC , 0666 );if( -1 == file_fd ){fprintf( stderr , "open abc.c error , msg:%s\n", strerror(errno));return -1 ;}else{printf("open abc.c succeed , file descriptor : %d \n " , file_fd);}// 写入内容char str1[] = "hello word hello FFFF ello111222";//ssize_t ret_val = write ( file_fd , "Hello GZ2123", sizeof("Hello GZ2123"));ssize_t ret_val = write ( file_fd , str1, sizeof(str1));if( -1 == ret_val ){fprintf( stderr , "write abc.c error , msg:%s\n", strerror(errno));return -1 ;}else{printf(" write succeed : %ld byet \n" , ret_val);}//这里不使用偏移函数,使用关闭再打开文件也同样可以进行读取操作//重新打开文件,读写的偏移位自动为开头// close(file_fd);// open("abc.c", O_RDWR, 0666 );//把读写位置偏移到开头ret_val = lseek(file_fd , 0 , SEEK_SET ); printf("偏移后:%ld\n" , ret_val);//读取文件的内容char msg [128] ; // 设置一个用户缓冲区bzero(msg, sizeof(msg) ); // 清空内存区ret_val = read( file_fd , msg , sizeof(msg) );if(-1 == ret_val ){perror("读取文件失败");return -1 ;}else{printf("成功%ld字节 , 内容为:%s\n" , ret_val , msg );}close(file_fd);return 0; }
结果
六.复制文件
6.1 方法1:cp 命令
可以直接使用cp进行复制
cp open_1.c a.txt1
6.2 方法2:使用缓冲区拷贝
这里使用缓冲区进行循环拷贝
代码为:
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h>#define SRC_PATH "./open_1.c" #define TAG_PATH "a.txt" #define SIZE_MEM 128int main(int argc, char const *argv[]) {//打开两个文件int tag_fd = open( TAG_PATH , O_WRONLY | O_CREAT | O_TRUNC , 0666 ); // 以只写的权限申请打开文件if(-1 == tag_fd ){perror("拷贝的新文件a.txt出现问题\n");return -1 ;}int src_fd = open( SRC_PATH , O_RDONLY ); // 以只写的权限申请打开文件if(-1 == src_fd ){perror("原文件open_1.c打不开\n");return -1 ;}// 创建一个用户缓冲区char * msg = calloc(1, SIZE_MEM);if( NULL == msg ){perror("缓冲区容量异常");close(src_fd);close(tag_fd);return -1 ;}ssize_t ret_val = -1 ;do{// 读取文件c.txt 存入用户缓冲区中ret_val = read( src_fd , msg , SIZE_MEM );if( ret_val < 0 ){perror("读取文件异常");break ;}printf("读取到的字节:%ld\n" , ret_val);// 写入到文件中ret_val = write(tag_fd , msg , ret_val );printf("写入的字节:%ld\n" , ret_val);}while ( ret_val >= SIZE_MEM );// 关闭文件close(src_fd);close(tag_fd);return 0; }
这里生成的a.txt为拷贝后的文件
6.3 方法3:主函数传参
使用主函数
可以看出我们把read.c复制一份为Even.c
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h>#define SRC_PATH "./open.c" #define TAG_PATH "a.txt" #define SIZE_MEM 128// ./a.out 1.c 2.c int main(int argc, char const *argv[]) {if( argc != 3 ){printf("请输入正确的参数!!!\n");return -1 ;}//打开两个文件int tag_fd = open( argv[2] , O_WRONLY | O_CREAT | O_TRUNC , 0666 ); // 以只写的权限申请打开文件if(-1 == tag_fd ){perror("作业本找不到");return -1 ;}int src_fd = open( argv[1] , O_RDONLY ); // 以只写的权限申请打开文件if(-1 == src_fd ){perror("借不到作业本");return -1 ;}// 创建一个用户缓冲区char * msg = calloc(1, SIZE_MEM);if( NULL == msg ){perror("脑容量异常");close(src_fd);close(tag_fd);return -1 ;}ssize_t ret_val = -1 ;do{// 读取文件c.txt 存入用户缓冲区中ret_val = read( src_fd , msg , SIZE_MEM );if( ret_val < 0 ){perror("读取文件异常");break ;}printf("读取到的字节:%ld\n" , ret_val);// 写入到文件中ret_val = write(tag_fd , msg , ret_val );printf("写入的字节:%ld\n" , ret_val);}while ( ret_val >= SIZE_MEM );// 关闭文件close(src_fd);close(tag_fd);return 0; }
相关文章:
系统IO函数接口
目录 前言 一. man手册 1.1 man手册如何查询 1.2 man手册基础 二.系统IO函数接口 三.open打开文件夹 3.1 例1 open打开文件 3.2 open打开文件代码 3.3 例2 创建文件 四.write写文件 4.1 write写文件 五. read读文件 5.1 read读文件与偏移 5.2 偏移细节 5.3 read读文件代码 六.复…...
06 监听器
文章目录 SessionAttListenerDemo.javaSessionListenerDemo.javaProductController.java SessionAttListenerDemo.java package com.aistart.listener;import javax.servlet.ServletContext; import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpSess…...
C语言第三十九弹---预处理(上)
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 预处理 1、预定义符号 2、#define定义常量 3、#define定义宏 4、带有副作用的宏参数 5、宏替换的规则 6、宏和函数的对比 总结 在C语言中,预处…...
计算机视觉无人驾驶技术:入门指南
I. 引言: 计算机视觉无人驾驶技术是一种基于计算机视觉和机器学习技术的自动化驾驶技术。它可以通过搭载各种传感器和摄像机,让车辆自主感知周围环境,实现尽可能自动化的驾驶操作。 这种技术具有重要性和优势,包括: …...
Golang和Java对比
其实我是Javaer转的Golang,我谈谈自己对Java和Golang的体会 我先讲讲我认为Golang的优点 1、Golang是一门新语言,相比于Java,他的生态要小很多,优点很明显,自由度高,学习成本低,能快速拉起一个…...
2024.2.29力扣每日一题——统计可能的树根数目
2024.2.29 题目来源我的题解方法一 深度搜索(暴力) 超时方法二 树形动态规划 题目来源 力扣每日一题;题序:2581 我的题解 方法一 深度搜索(暴力) 超时 以每个节点node为跟进行深度搜索,并在搜…...
同一个主机配置多个SSH key
使用git时,我们可能一个git客户端使用多个git服务器,比如github,自建gitlab,gitee,为了防止提交混乱,所以需要一一对应生成公私钥。 第一步: 使用ssh-keygen生成多对密钥对,比如&…...
SAP系统财务模块简介:实现财务管理的卓越之道
作为全球领先的企业管理软件提供商,SAP公司开发了一系列强大而全面的财务模块,帮助企业实现财务管理的高效运作与优化。SAP系统的财务模块涵盖了财务核算、成本管理、资金管理、资产会计等多个方面,为企业提供了完整的财务管理解决方案。本文…...
【pytest】功能特性及常用插件
pytest是一个功能强大的Python测试框架,它的语法简洁明了,易于学习和使用。同时,它提供了丰富的功能和插件,使得测试过程更加灵活和高效。 功能特性 pytest的主要功能特性包括: 参数化测试:允许使用不同…...
基于SpringBoot和Vue的房产销售系统的设计与实现
今天要和大家聊的是一款基于SpringBoot和Vue的房产销售系统的设计与实现 !!! 有需要的小伙伴可以通过文章末尾名片咨询我哦!!! 💕💕作者:李同学 💕…...
ROS2从入门到精通1-2:详解ROS2服务通信机制与自定义服务
目录 0 专栏介绍1 服务通信模型2 服务模型实现(C)3 服务模型实现(Python)4 自定义服务5 话题、服务通信的异同 0 专栏介绍 本专栏旨在通过对ROS2的系统学习,掌握ROS2底层基本分布式原理,并具有机器人建模和应用ROS2进行实际项目的开发和调试的工程能力。…...
vue两个特性和什么是MVVM
一、什么是vue 1.构建用户界面 用vue往html页面中填充数据,非常的方便 2.框架 框架是一套线成的解决方案 vue的指令、组件(是对ui结构的复用)、路由、vuex 二、vue的特性 1.数据驱动视图 2.双向数据绑定 1.数据驱动视图 数据的变化会驱动…...
CAD Plant3D 2023 下载地址及安装教程
CAD Plant3D是一款专业的三维工厂设计软件,用于在工业设备和管道设计领域进行建模和绘图。它是Autodesk公司旗下的AutoCAD系列产品之一,专门针对工艺、石油、化工、电力等行业的设计和工程项目。 CAD Plant3D提供了一套丰富的工具和功能,帮助…...
集成电路企业tapeout,如何保证机台数据准确、完整、高效地采集?
Tapeout即流片,集成电路行业中将CDS最终版电路图提交给半导体制造厂商进行物理生产的过程。在芯片设计与制造的流程中,Tapeout是非常重要的阶段,包括了布局(Layout)、连线(Routing)、分析&#…...
Nginx三大常用功能“反向代理,负载均衡,动静分离”
注意:以下案例在Windows系统计算机作为宿主机,Linux CentOS 作为虚拟机的环境中实现 一,Nginx配置实例-反向代理 1.反向代理 案例一 实现效果:使用nginx反向代理,访问 www.123.com 直接跳转到127.0.0.1:8080 准备工…...
类方法介绍、使用细节
...
Java SpringBoot中优雅地判断一个对象是否为空
在Java中,可以使用以下方法优雅地判断一个对象是否为空: 使用Objects.isNull()方法判断对象是否为空: import java.util.Objects;if (Objects.isNull(obj)) {// obj为空的处理逻辑 }使用Optional类优雅地处理可能为空的对象: impo…...
算法——矩阵:对于边界元素的处理
. - 力扣(LeetCode) 题目简述:扫雷,点击一个格子,返回整个地图的下一个状态。 对于边界元素,可以设置两个数组,index_row,index_col,遍历到一个格子需要搜索其周围格子…...
Git分支提交时自动大写 fatal: the remote end hung up unexpectedly
先说结论: 进入 .git/refs/heads目录,会看到Feature文件夹,重命名为feature即可。 表现: 通过终端命令创建的分支 git checkout -b feature/name 使用git push后自动变成了Feature/name 并且有时候在本地创建feature/1234567…...
隐私计算实训营第七讲-隐语SCQL的架构详细拆解
隐私计算实训营第七讲-隐语SCQL的架构详细拆解 文章目录 隐私计算实训营第七讲-隐语SCQL的架构详细拆解1.SCQL Overview1.1 多方数据分析场景1.2 多方数据分析技术路线1.2.1 TEE SQL方案1.2.2 MPC SQL方案 1.3 Secure Collaborative Query Language(SCQL)1.3.1 SCQL 系统组件1.…...
Android JNI开发定义全局变量
要在 C 文件中设置一个 string 类型的全局变量,让其他 C 文件都可以访问,并且可以通过 JNI 方法修改这个变量,可以按照以下步骤进行操作 定义全局变量: 在一个头文件(比如 common.h)中定义一个全局的 strin…...
docker容器部署gitlab的runner的shell模式注册下job中无法使用docker指令
引言 现需通过gitlab-runner来构建jar部署的镜像,发现在job中无法使用docker指令,解决的过程中出现一系列异常,在此做个问题解决的记录。 内容 通过docker-compose部署 name: java-env services:env-gitlab-runner:restart: alwaysimage: env/gitlab-runner-java:latest…...
【SpringCloud】Zuul网关中心 代码详细介绍
Zuul是Spring Cloud中的一个API网关组件,它负责处理服务路由、监控、弹性、安全等API网关的核心功能。Zuul在Spring Cloud Netflix套件中是一个重要的组件,但需要注意的是,随着Spring Cloud的不断发展,Zuul已经被Spring Cloud Gat…...
Delphi D12中实现安卓中文语音合成(中文朗读)不用第三方控件
Delphi开发一个可以朗读中文的APP就非常的简单。 本文给大家介绍使用Delphi开发基于安卓原生的TTS(中文语音合成),将文字转语音实现中文的朗读。APP运行后,需要手机上已安装语音引擎。如果您手机上已安装并设置了语音引擎…...
设计模式 - Provider 模式
在某些情况下,我们希望为应用程序中的许多(如果不是全部)组件提供数据。尽管我们可以使用 props 将数据传递给组件,但如果应用程序中的几乎所有组件都需要访问 prop 的值,这可能很难做到。 我们经常遇到所谓的属性钻探…...
R语言颜色细分
1.如何对R语言中两种颜色之间进行细分 2.代码: x <- colorRampPalette(c("#FC8D62","#FDEAE6"))(12) #打印向量值 # 按字典顺序排序颜色值 x_sorted <- sort(x,decreasing TRUE)# 打印排序后的颜色值 print(x_sorted)#展示颜色 scales:…...
面向返回编程ROP问题及挑战
像我们描述的执行权限等功能已经使执行任意代码变得越来越困难。这意味着攻击者使用其他方法,比如面向返回编程(ROP)。ROP利用了许多现代系统中软件堆栈的规模。攻击者分析系统中的软件,寻找小工具(gadgets)…...
vscode shadertoy插件,非常方便的glsl着色器编写工具
很著名的shadertoy网站,集合了非常多大神利用数学写出美妙的shader效果。像shadertoy创始人之一的IQ大神它在这方面有很多的建树。他的利用光线步进和躁声可以创建很多不可思议的3D场景。 vscode有一件shadertoy的插件,安装后可以新建一个*.glsl文件&am…...
网络请求避坑,私有网络请求(Private Network Access)
前言 网络请求,大家肯定熟悉的不能再熟悉,网络请求失败,大家也肯定很熟悉。排查网络请求,也是我们必备的技能,对不,兄弟。 我坦言,最怕两种网络请求失败。 第一种:PC端模拟没有异常…...
AVL树和红黑树
AVL树和红黑树 AVL树理论代码实现 红黑树理论代码实现 AVL树 理论 我们知道二叉搜索树拥有极高的搜索效率,但当二叉搜索树退化成单支时,其查找效率会大幅下降,因此我们需要避免其出现单支的情况,并且尽可能让其接近满二叉树。解…...
合肥网站建设是什么/seo需要会什么
12月13-14日,由云栖社区与阿里巴巴技术协会共同主办的《2017阿里巴巴双11技术十二讲》顺利结束,集中为大家分享了2017双11背后的黑科技。本文是《人工智能在搜索中的应用》演讲整理,本文首先介绍了AI如何在搜索中落地,进而重点介绍…...
做网站不赚钱了/app制作一个需要多少钱
题目:子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程100次,如此循环50次,请写出程序。 1 public class TraditionalThreadSynchronized2 {2 public static void main(…...
临沂建手机网站公司/上海职业技能培训机构
jdbc statement的说法 1.Statement、PreparedStatement和CallableStatement都是接口(interface)。 2.Statement继承自Wrapper、PreparedStatement继承自Statement、CallableStatement继承自PreparedStatement。 3. Statement接口提供了执行语句和获取结果的基本方法࿱…...
住房和城乡建设网站方案/百度今日排行榜
安装php时候遇到的问题: dpkg: 处理软件包 php7.1-opcache (--configure)时出错: 依赖关系问题 - 仍未被配置dpkg: 依赖关系问题使得 php7.1-readline 的配置工作不能继续: php7.1-readline 依赖于 php7.1-common;然而:…...
网站开发语/合肥网络优化推广公司
简易的Pandas之路任何使用Python数据的人都会熟悉Pandas包。Pandas是大多数行和列格式数据的go-to包。如果你没有Pandas,请确保在终端中使用pip install安装:pip install pandas现在,让我们看看Pandas包中的默认方法可以做些什么:…...
营销型高端网站建设价格/百度竞价冷门产品
欢迎关注”生信修炼手册”!对于任意的表达量数据,定量加差异分析都是一套经典的组合拳。当我们想要展示特定基因的组间差异结果时,下面这种图表就派上了用场横坐标为基因,纵坐标是基因表达量,每一组的表达量采用了箱体图的形式来展…...