Linux-IO编程

news/2025/2/20 21:03:02/

Linux操作组成 

一、文件

在 Linux 中,有一句经典的话叫做:一切皆文件。这句话是站在内核的角度说的,因为 在内核中所有的设备 (除了网络接口) 都一律使用 Linux 独有的虚拟文件系统 (VFS) 来管 理。这样做的最终目的,是将各种不同的设备用“文件”这个概念加以封装和屏蔽,简化应 用层编程的难度。文件,是 Linux 系统最重要的两个抽象概念之一 (另一个是进程) 。

        1.文件与文件名

                文件:一组相关数据的有序集合

                文件名:这个数据集合的名称

        2.linux的文件分类

b block         块设备文件       按块扫描设备信息          文件IO
c character     字符设备文件     按字符扫描设备信息        文件IO
d directory     目录文件         存放文件信息             目录IO、文件IO
-               普通文件         存放用户信息             标准IO、文件IO
l link          链接文件         与某个指定文件链接        链接IO、文件IO
s socket        socket文件       进程间通信               文件IO
p pipe          管道文件         进程间通信               文件IO

        3、IO概念 

                I:输入

                O:输出

        4.标准IO和文件IO的区别

                

                文件IO:系统调用,是Linux内核的函数接口
                        没有缓存IO,实时性好

                        用户空间进程访问内核的接口

                        把用户从底层的硬件编程中解放出来

                        极大的提高了系统的安全性

                        使用户程序具有可移植性

                        是操作系统的一部分

                标准IO:是库函数,是对文件IO的封装
                        是有缓存的IO,实时性差

                        库函数为了实现某个功能而封装起来的API集合

                        提供统一的编程接口,更加便于应用程序的移植

                        是语言或者应用程序的一部

        5、系统调用和库函数

                1、库函数与系统调用的关系

                        

         2、库函数

                库函数对系统调用的封装,用户调用库函数并不能完成对应的功能,而是要由库函数,

                调用系统调用实现相关的功能

        3、系统调用

                Linux内核中的函数接口,称为系统调用

                库函数每次调用内核中的代码称为一次系统调用

                用户可以通过Linux系统提供的系统调用内核中的接口

        4、能够根据应用场景选择合适的方式:
                操作普通ASCII码文件 :
                        fgetc/fputc 逐个字符操作
                        fgets/fputs 逐行操作   
                        fscanf/fprintf 指定格式操作
                操作普通二进制文件 
                        fread/fwrite 二进制操作文件
                设备文件/通信文件 
                        read/write 二进制文件操作

二、标准IO

        1、操作文件步骤

                        1、打开文件open

                        2、读写文件 write/read

                        3、关闭文件 close

        2、打开文件(open)

#查看命令手册
man 3 open原型:FILE *fopen(const char *pathname, const char *mode);
功能: 打开文件、将文件的属性赋予到流中
参数: 
pathname:文件路径:带路径的文件名
mode:打开文件的方式以及权限 分6个代号权限                          打开文件的情况                  写的方式
r                                 只读                          文件必须事先存在
r+                                可读可写                      文件必须事先存在清空模式
w                                 只写                          文件不存在则创建清空模式
w+                                可读可写                      文件不存在则创建清空模式
a                                 只写                         文件不存在则创建追加模式
a+                                可读可写                      文件不存在则创建追加模式返回值: 
成功返回:
流:文件指针
失败返回NULL,并返回错误码

         3、关闭文件

man 3 fclose
int fclose(FILE *stream);
功能: 关闭相应的流参数: stream:流返回值:
成功:0
失败:EOF

        4、三个特殊的流

                stdin:标准输入流,从终端接收数据,getc,scanf,getchar都是依赖stdin实现

                stdout:标准输出流,向终端打印数据,puts,printf,putchar都是依赖stdout实现

                stderr:标准出错流,perror依赖与stderr流实现

        5、流的缓存

                全缓存:缓存区满刷新,程序结束或者调用fclose刷新,fflush刷新,缓存区大小

                (4k == 4096)

                        应用场景:与文件建立的缓存均为全缓存

                行缓存:遇到\n刷新,程序结束或者调用fclose刷新,fflush刷新,缓存区大小

                        (1k == 1024)

                        应用场景:与终端建立的缓存均为行缓存,stdin,stdout都是行缓存

                不缓存:立即刷新,缓存区大小(0k)

        6、流的输入输出

                

 

        7、普通文件的分类

                ASCII码文件

                        文件中所有内容均为能够在终端显示的ASCII码字符

                二进制文件:

                        保存文件本身的数据(数据可能无法在终端显示或在终端显示乱码)

                        图片,视频,压缩包  (ASCII码文件是一个特殊的二进制文件)

        8、函数接口

                1、fputc
man 3 fputc原型:int fputc(int c, FILE *stream);
功能: 对相应的流写入一个字符 
参数: c:需要写入的字符的ASCLII码值stream:文件流指针返回值: 成功返回写入的字符的ASCII值 ,失败返回EOF,并返回错误码fputc(ch, stdout) == putchar(ch)
                2、fgetc
man 3 fgetc
原型:int fgetc(FILE *stream);
功能:从流中接收一个字符
参数:stream:文件流指针
返回值:成功返回接收到字符的ASCII码值
失败返回EOF(-1)
读到文件末尾返回EOF(-1)
ch = fgetc(stdin) == ch = getchar()
                3、fputs
man 3 fputs
原型:int fputs(const char *s, FILE *stream);
功能:将字符串写入流中
参数:s:写入字符串空间首地址
stream:文件流指针
返回值:
成功返回非负值
失败返回EOF
                4、fgets
man 3 fgets
原型:char *fgets(char *s, int size, FILE *stream);
功能:从终端接收一行字符串
参数:s:存放字符串空间首地址
size:最多存放元素个数
stream:文件流指针
返回值:
存放数据空间首地址
失败或者读到文件末尾返回NULL
                5、fprintf
man 3 fprintf
原型: int fprintf(FILE *stream, const char *format, ...);
功能:向流中写入格式化字符串
参数:stream:文件流指针
format:格式化字符串
返回值:
成功返回打印的字符个数
失败返回负数
printf("hello world!\n");
fprintf(stdout, "hello world!\n");
              6、fscanf
man 3 fscanf
原型:int fscanf(FILE *stream, const char *format, ...);
功能:从流中读取格式化的字符串
参数:stream:文件流指针
format:格式化字符串形式
返回值:
成功返回匹配的输入控制符个数
失败或者读到文件末尾返回EOF
               7、fwrite
man 3 fwrite
原型:size_t fwrite(const void *ptr, size_t size, size_t
nmemb,FILE *stream);
功能:向流中写入ptr指向的nmemb个元素,每个元素size字节
参数:
ptr:存放数据空间的首地址
size:每个元素的大小
nmemb:元素个数
stream:文件流指针
返回值:
成功返回写入对象的个数
失败返回0
                8、fread
man 3 fread
原型:size_t fread(void *ptr, size_t size, size_t nmemb, FILE
*stream);
功能:从流中读取nmemb个对象,存放ptr指向的空间中,每个对象size字节
参数:
ptr:存放数据空间首地址
size:每个元素的大小
nmemb:对象个数
stream:文件流指针
返回值:
成功返回实际读到对象个数
失败返回0
读到末尾返回0
                9、fseek
man 3 fseek
原型:int fseek(FILE *stream, long offset, int whence);
功能:设置流的偏移量
参数:
stream:流
offset:偏移量
whence:
SEEK_SET 文件开头
SEEK_CUR 文件当前位置
SEEK_END 文件末尾
返回值:
成功返回0
失败返回-1
void rewind(FILE *stream);
功能:
将流的偏移量重新定位到开头
fseek(stream, 0, SEEK_SET) == rewind(stream)
long ftell(FILE *stream);
功能:
获得流的偏移量

三、文件IO

        1. 操作文件步骤:

                    打开文件open
                    读写文件 write/read
                    关闭文件 close

        2. 函数接口:

                1. open
man 2 open
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
功能:
打开文件
参数:
pathname:打开文件名
flags:O_RDONLY 只读
O_WRONLY 只写
O_RDWR 读写
O_CREAT 文件不存在就创建,需要传入第3个参数
O_TRUNC 文件存在截断
O_APPEND 追加
O_ASYNC 异步IO
O_NONBLOCK 非阻塞IO
mode:
rwx:创建该文件的用户对文件是否拥有读写执行的权限
rwx:创建该文件用户同组的用户对文件是否拥有读写执行的权限
rwx:其余人是否对文件拥有读写执行的权限
rwx:7
rw-:6
r-x:5
r--:4
-wx:3
-w-:2
--x:1
---:0
返回值:
成功返回新文件描述符
失败返回-1
        2. close
man 2 close
int close(int fd);
功能:
关闭fd对应的文件描述符
请写出标准IO对应的文件IO的操作方式:
"r" open(filename, O_RDONLY);
"r+" open(filename, O_RDWR);
"w" open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0664);
"w+" open(filename, O_RDWR | O_CREAT | O_TRUNC, 0664);
"a" open(filename, O_WRONLY | O_CREAT | O_APPEND, 0664);
"a+" open(filename, O_RDWR | O_CREAT | O_APPEND, 0664);
        3. write
man 2 write
ssize_t write(int fd, const void *buf, size_t count);
功能:
将buf开始的count个字节写入文件描述符fd中
参数:
fd:文件描述符
buf:要写入的数据空间首地址
count:写入的字节数
返回值:
成功返回写入文件中字节数
失败返回-1
        4. read
man 2 read
ssize_t read(int fd, void *buf, size_t count);
功能:
从文件描述符中读取count个自己数据放入buf对应的空间
参数:
fd:文件描述符
buf:存放数据空间首地址
count:最多存放元素的个数
返回值:
成功返回实际读到字节数
失败返回-1
        5. lseek
man 2 lseek
off_t lseek(int fd, off_t offset, int whence);
功能:
重定位流的偏移量
参数:fd:文件描述符offset:偏移量whence:SEEK_SET:文件开头SEEK_CUR:文件当前位置SEEK_END:文件末尾
返回值:
成功返回偏移量
失败返回-1

四:目录IO

        1. opendir

man 3 opendir
DIR *opendir(const char *name);
功能:
打开目录获得目录流指针
参数:
name:要打开文件的名称
返回值:
成功返回目录流指针
失败返回NULL
int closedir(DIR *dirp);
功能:
关闭目录流指针

        2. closedir

man 3 closedir
int closedir(DIR *dirp);
功能:
关闭目录流指针

        3. readdir

man 3 readdir
struct dirent *readdir(DIR *dirp);
功能:
读取下一个目录项的信息
参数:
dirp:目录流指针
返回值:
成功返回读到目录项信息的结构体指针
失败或者读到末尾返回NULL
struct dirent {
ino_t d_ino; /* Inode number */
off_t d_off; /* Not an offset; see below */
unsigned short d_reclen; /* Length of this record */
unsigned char d_type; /* Type of file; not supported
by all filesystem types */
char d_name[256]; /* Null-terminated filename */
};
d_ino:通过这个inode能够找到该文件在磁盘中存放的位置
d_off:当前目录项在整个目录流中的偏移量
d_reclen:这条记录的大小
d_type:文件类型
d_name:文件名

        4. mkdir

man 3 mkdir
int mkdir(const char *pathname, mode_t mode);
使用方法:
mkdir(filename, 0777);
目录中
x:用户是否能够进入目录中
w:用户是否能在目录中新建文件
r:用户是否能够读取目录中的信息

        5. rmdir

man 2 rmdir
int rmdir(const char *pathname);
功能:
删除空目录文件
使用方法:
rmdir(filename);

        6. chdir

man 3 chdir
int chdir(const char *path);
功能:
修改程序当前的工作路径
参数:
path:要切换的路径
返回值:
成功返回0
失败返回-1

        7. getcwd

man 3 getcwd
char *getcwd(char *buf, size_t size);
功能:
获得当前工作路径
参数:
buf:将工作路径放入buf对应的空间
size:最多存放字符的个数
返回值:
成功返回存放字符串空间首地址
失败返回NULL


http://www.ppmy.cn/news/1573319.html

相关文章

LabVIEW 中dde.llbDDE 通信功能

在 LabVIEW 功能体系中,位于 C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform\dde.llb 的 dde.llb 库占据着重要的地位。作为一个与动态数据交换(DDE)紧密相关的库文件,它为 LabVIEW 用户提供了与其他…

摄像头畸变矫正

简单介绍 所谓畸变其实就是由摄像头引起的图片失真, 一般在广角摄像头表现明显, 原本平整的桌面通过镜头看像个球面, 直观的解释直线被拍成了曲线, 这让我想起来了一个表情包. 去畸变的办法 首先我们需要一个标准棋盘(印有特定的标定图案), 如图: 把它摊平放在桌子上, 然后用…

MySQL 中各种日志简介

MySQL 日志 慢查询日志(Slow query log) 慢查询⽇志由执⾏时间超过系统变量 long_query_time 指定的秒数的SQL语句组成,并且检 查的⾏数⼤于系统变量 min_examined_row_limit 指定值。被记录的慢查询需要进⾏优化, 可以使⽤mysqldumpslow客⼾端程序对慢…

Docker-Client for Java: 在Kotlin与Groovy中的Docker操控利器

Docker-Client for Java: 在Kotlin与Groovy中的Docker操控利器 docker-client A Docker client for Java written in Kotlin and Groovy 项目地址: https://gitcode.com/gh_mirrors/doc/docker-client 项目基础介绍及编程语言 Docker-Client 是一个专为Java虚拟机&…

自动化测试平台ATECLOUD全面解析

ATECLOUD 平台是什么 ATECLOUD 智能云测试平台是由纳米软件自主研发的数智化文字编程软件平台,在电子测试领域表现卓越。 该平台可用于上位机软件开发,具有一拖即用的便捷性,让不懂编程的人也能快速上手。与传统的代码编程和 LabVIEW 软件的…

广义表学习笔记

1. 广义表的定义 广义表(Generalized List)是一种递归的数据结构,可以为空表或包含原子和子表的表。广义表中的元素可以是原子(不可再分的基本元素)也可以是广义表,这使得广义表能够表示具有复杂嵌套结构的…

HTTP 和 TCP/IP-傻傻分不清

HTTP 和 TCP/IP 是计算机网络中不同层次的协议,它们的核心区别在于功能和所属的网络层次。以下是详细对比: 1. 所属网络层次 TCP/IP 定位:TCP/IP 是一个协议族(包含多个协议),涵盖网络通信的传输层和网络层…

scala中正则表达式的使用2.0

// 如果有一个字符串数组: // 统计词频val arr1 Array("thank","you","very","much","thank","very")val m1 scala.collection.mutable.Map[String, Int]()arr1.foreach(word > {// 检查是否出现…