linux下的文件操作IO
前言
文件IO
,又称系统IO
,系统调用
打开 open
流程:1.创建一个.c在vim中编译
2.引入头文件
#include<unistd.h>#include<fcntl.h>#include<errno.h>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>
3.代码
int fd = open("3.txt",O_RDWR|O_CREAT,0777);
4.代码说明
设定返回值类型 一般打开是int型的
利用open打开(“文件名和文件类型”,O大写_方式(只读/只写/读写)|或O_CREAT没有创建,0xxx权限分配)
5.判定是否打开成功,要严谨
if(fd<0){printf("qnmd\n");printf("error no",errno);}else{printf("succ %d\n",fd);}
读
就是从文件中读取数据
模式:O_RDONLY或者O_RDWR(只读模式/读写模式)
函数:read(fd,buf,读多少)
代码:
int fd = open("3.txt",O_RDONLY);int ret = read(fd,buf,20);
buf是提前定义好的一个空数组;
写
将东西写进文件中
模式:O_WRONLY 或者 O_RDWR(只写、读写)
函数:write(fd,buf,20)
代码:
char bufw[100] = "JDG WIN";int ret1 = write(fd,bufw,20);
读写 : RDWR
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main()
{ char buf[50] = "asd123456789qwe3ra aea aqe awqaea";char buf1[50] = {'\0'};int fd=open("1.txt",O_RDWR);if(fd<0){printf("qnmd");}int ret3 = write(fd,buf,40);int ret4 =read(fd,buf1,10);printf("nris : %s\n",buf1);close(fd);return 0;
}
文件描述符
在 Linux 的世界里,一切设备皆文件。对文件的操作都是通过文件描述符(fd)来进行的。
文件描述符:是内核为了高效管理已被打开的文件所创建的索引,是一个非负整数用于指代被打开的文件,所有执行I/O操作的系统调用都是通过文件描述符。说白了就是你自定的那个fd......本质其实类似数组下标0123456789.....(0 1 2)一般被 ’流‘ 占用。
文件属性
一般分为阻碍与非阻碍
fcntl函数
需要头文件: #include<fcntl.h>
作用:改文件的属性
关键点: F_GETL获取文件状态
F_SETL设置文件状态
int ret = fcntl(STDIN_FILENO,F_SETFL,flag);
完整代码:
#include<unistd.h>
#include<fcntl.h>
#include<errno.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>int main(){char buf[10];int n,fd;int flag = fcntl(STDIN_FILENO,F_GETFL);if(flag<0){perror("get failed\n");}flag |=O_NONBLOCK;int ret = fcntl(STDIN_FILENO,F_SETFL,flag);if(ret<0){perror("get failed\n");}int i;for(i=0;i<5;i++){n=read(STDIN_FILENO,buf,10);if(n>0){break;}if(n<0){if(errno!=EAGAIN){perror("error result\n");}else{write(STDIN_FILENO,"try again\n",strlen("try again\n"));sleep(3);}}} if(i==5){write(STDOUT_FILENO,"TIME OUT\n",strlen("TIME OUT\n"));}else{write(STDOUT_FILENO,buf,n);}close(fd);return 0;
}
lessk函数
作用:修改读写位置
lseek(fd,-6,SEEK_END);
文件首
SEEK- SET ==0
文件当前位置
SEEK- CUR ==1
文件尾
SEEK- END ==2
完整代码
#include<unistd.h>
#include<fcntl.h>
#include<errno.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>int main(){int fd,b;char msi[50] = "it is my life\n";char ch;fd = open("life.txt",O_RDWR|O_CREAT,0777);if(fd<0){printf("qnmd\n");}write(fd,msi,strlen(msi));lseek(fd,-6,SEEK_END);while(b=read(fd,&ch,1)){if(b<0){printf("qnmd");}else if(b==0){printf("it is end\n");}else{write(STDOUT_FILENO,&ch,b);}}close(fd);
return 0;
}
truncate函数
短截文件
od
一个命令
作用:显示文件
可以加:
dup/dup2
作用:修改文件描述符
参数:一个文件描述符如:fd 返回一个新的文件描述符:如自己输一个newfd
int fd = open("dp.txt",O_RDWR|O_CREAT,0777);if(fd<0){printf("qnmd\n");}int newfd = dup(fd);
dup2
就是俩文件描述符 超级加倍
上代码
#include<unistd.h>
#include<fcntl.h>
#include<errno.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
int main(){int fd = open("dp.txt",O_RDWR|O_CREAT,0777);if(fd<0){printf("qnmd\n");}int fd2 = open("dp2.txt",O_RDWR|O_CREAT,0777);int newfd = dup2(fd,fd2);write(fd,"hello\n",strlen("hello"));write(fd2,"hi\n",strlen("hello"));write(newfd,"fku\n",strlen("hello"));printf("%d %d %d ",fd,fd2,newfd); close(fd);close(fd2);close(newfd);return 0;
}
复习标准io
linux下的文件操作IO相关推荐
- Linux下对文件操作时出现乱码怎么办?
Linux下对文件操作经常会遇见乱码问题,我在网上搜了一些解决方法,希望能对大家有所帮助. 如果你需要在Linux中操作windows下的文件,那么你可能会经常遇到文件编码转换的问题.Windows中 ...
- linux下怎么批量命名文件,linux下的文件操作——批量重命名
概述:在日常工作中,我们经常需要对一批文件进行重命名操作,例如将所有的jpg文件改成bnp,将名字中的1改成one,等等.文本主要为你讲解如何实现这些操作 1.删除所有的 .bak 后缀: renam ...
- c++ windows获得当前工作目录文件_基于linux下Python文件操作
Python中的文件操作 1.文件的打开与关闭 想一想:如果想用word编写一份简历,应该有哪些流程呢? 1.打开word软件,新建一个word文件 2.写入个人简历信息 3.保存文件 4.关闭wor ...
- linux 文件操作函数,Linux下的文件操作函数及creat用法
编写Linux应用程序要用到如下工具: (1)编译器:GCC GCC是Linux平台下最重要的开发工具,它是GNU的C和C++编译器,其基本用法为:gcc [options] [filenames]. ...
- C语言linux下的文件操作(1)
文件操作: 欢迎加入QQ:498903810 一起交流.讨论知识,里面有大佬,也有小白,天下码农一家亲,大家一起讨论进步. 1.静态文件(Inode) 硬盘中的文件,就是静态文件.每一个文件都是以多个 ...
- Linux下对文件的操作及添加新用户
Linux下对文件的操作及添加新用户 一.对文件的操作 1.打包压缩文件 2.解压缩文件 3.对文件操作的其他命令 二.创建新用户 一.对文件的操作 1.打包压缩文件 2.解压缩文件 3.对文件操作的 ...
- Linux 下的五种 IO 模型
Linux 下的五种 IO 模型 来源:decaywood's Blog 概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2 ...
- linux下的五种io模型,Linux下的五种IO模型
Java中提供的IO有关的API,在文件处理的时候,其实依赖操作系统层面的IO操作实现的(关于Java对IO的三种封装,可见我的另一篇博客) 开门见山,Linux下的如中IO模型:阻塞IO模型,非阻塞 ...
- linux 网络io命令详解,Linux下五种网络IO模型详解
本文我们主要来了解一下Unix/Linux下5种网络IO模型:blocking IO, nonblocking IO, IO multiplexing, signal driven IO, async ...
最新文章
- 使用同一个目的port的p2p协议传输的tcp流特征相似度计算
- 再读simpledb 之 元数据管理(3)
- python 切割字符串
- 数据中心怎么关机?光有UPS还不够
- mysql 逻辑处理_mysql 逻辑查询处理流程
- ubuntu 16.04 + apache2 将php7.1 切换到 php7.3
- [设计模式] - Singleton单例模式
- 启动两个tomcat,两个端口,两个tomcat都启动时回显示端口被占用
- 写一个自动阅读的方法(需要运用html和css和JavaScript)
- js将html替换字符串,js 替换字符串指定内容 javascript 替换指定位置的字符
- 如何设置win7计算机不更新,win7系统不要自动更新的设置步骤(图文)
- pthread 立即停止线程_pthread_create线程终止问题
- java.awt.Color 颜色代码对照表
- ubuntu中/usr目录下无法直接复制粘贴文件或目录
- 自动化测试 —— Pytest测试框架
- 3D方面的一些英文词汇解释
- 我弟今年高考,报的志愿是电子信息,到现在录取的是计算机科学与技术,哪个专业更好一些,2021年电子信息科学与技术专业大学排名及分数线【统计表】...
- vue 实现级联选择器
- Method threw ‘io.netty.util.IllegalReferenceCountException‘ exception.
- 嵌入式数据库SQLite