linux--基础IO

一、熟悉open/read/write/close等文件相关系统调用接口。

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);
pathname: 表示要打开或创建的目标文件
flags:打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags。

//参数:
    O_RDONLY:只读打开
    O_WRONLY:只写打开
    O_RDWR  :读,写打开
    注意:这三个常量,必须指定一个且只能指定一个
    O_CREAT:若文件不存在,则创建它。需要使用mode选项(权限标志):
    来指明新文件的访问权限。
    O_APPEND:追加写

//返回值:
    成功:新打开的文件描述符
    失败:-1

文件权限标志
这里写图片描述

mode_t理解:文件权限标志也可以使用加权数字表示,这组数字被称为umask变量,它的类型是mode_t,是一个无符号八进制数。
umask变量表示方法:
这里写图片描述
注意:open函数具体使用哪个,和具体应用场景相关,如果目标文件不存在,需要open创建,则第三个参数表示创建文件的默认权限。否则,使用两个参数的open。

read

//头文件
    #include<unistd.h>

//函数原型
    ssize_t read(int fd,void *buf,size_t count);

//参数说明:
fd:文件描述符,用来指向要操作的文件的文件结构体   
buf:一块内存空间
count:请求读取的字节数,读上来的数据保存在缓冲区buf中,同时文件的当前读写位置向后移。
ssize_t:有符号整型

//返回值
成功返回读取的字节数,出错返回-1并设置errno,如果在调用read之前已到达文件末尾,则这次read返回0

有很多种情况可使实际读到的字节数少于要求读字节数:
(1)读普通文件时,在读到要求字节数之前已到达了文件尾端,如,若在到达文件尾端之前还有30字节,而要求读100个字节,则read返回30,下一次在调用read时,它将返回0.
(2)当从终端设备读时,通常一次最多读一行。
(3)当从网络读时,网络中的缓冲机构可能造成返回值小于所要求读的字节数。
(4)某些面向记录的设备,如磁带一次最多返回一个记录。
注意:读操作从文件的当前位移量处开始,在成功返回之前,该位移量增加实际读的字数。

write

//头文件
#include<unistd.h>

//函数原型
ssize_t write(int fd,const void *buf,size_t count);

//返回值
成功返回写入的字节数,出错返回-1并设置errno写常规文件时,write的返回值通常等于请求写的字节数count,而向终端或者网络写则不一定。

close

//头文件
#include<unistd.h>

//函数原型
int close(int fd);

//返回值
若成功返回0,出错返回-1

注意:关闭一个文件时也释放该进程加在该文件上的所有记录锁,当一个进程终止时,它所有的打开文件都由内核自动关闭。

二、对比fd和FILE,理解系统调用和库函数的关系。

文件描述符fd

概念
文件描述符通常是一个小的非负整数,内核用以标识一个特定进程正在访问的文件。当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。

3个缺省的文件描述符:
(1)linux进程默认情况下有3个缺省打开的文件描述符,它们分别是标准输入0,标准输出1,标准错误2.
(2)0,1,2对应的物理设备一一般是:键盘,显示器,显示器。
注意:POSIX定义了STDIN_FILENO,STDOUT_FILENO和STDERR_FILENO来代替0,1,2.

FILE结构体的内容

struct file结构体定义在/linux/include/linux/fs.h中,文件结构体代表一个打开的文件,系统中每个打开的文件在内核空间都有一个关联的struct file。它由内核在打开文件时创建,并传递给在文件上进行操作的任何函数,在文件的所以实例都关闭后,内核释放这个数据结构。在内核创建和驱动源码中,struct file的指针通常被命名为file或filp。

文件描述符fd与文件指针FILE*的关系

(1)文件描述符在系统的OS层,文件指针所在lib层。
这里写图片描述
(2)lib库是在操作系统上为用户所做的一层封装。

  • 缓冲方式方面:操作系统一般采用的无缓冲,而lib一般采用是全缓冲的方式。
  • 函数封装方面:在lib层所对应的标准输入std_in,标准输出std_out,标准错误std_err也正好对应文件描述符0,1,2.

    这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值