linux学习第11天(open函数,read函数,write函数)

open函数

manpage 第二卷,open函数如下,有两个版本的

返回一个文件描述符,理解为整数,出错返回-1

pathname      文件路径

flags         权限控制,只读,只写,读写。  O_RDONLY, O_WRONLY, O_RDWR

、、、、、、

第二个open

多了一个mode参数,用来指定文件的权限,数字设定法

文件权限 = mode & ~umask(进行按位与操作)

、、、、、、

以只读方式打开,文件没有就创建一个文件

、、、

open常见错误:

  1. 打开文件不存在
  2. 以写方式打开只读文件(权限问题)
  3. 以只写方式打开目录

当open出错时,程序会自动设置errno,可以通过strerror(errno)来查看报错数字的含义

以打开不存在文件为例:

open函数:

        int open(char *pathname, int flags)        头文件:#include<unistd.h>

参数:

        pathname:欲打开的文件路径名

        flags:文件打开方式        头文件:#include<fcntl.h>

O_RDONLY|O_WRONLY|O_RDWR|O_CREAT|O_APPEND|O_TRUNC|O_EXCL|O_NONBLOCK ....

返回值:

        成功:打开文件所得到的对应的文件描述符(整数)

        失败:-1,        设置errno

、、、

read和write函数实现copy

read函数:

        ssize_t read(int fd, void *buf, size_t count);

        参数:

                fd:文件描述符(-1,3等)

                buf:存数据的缓冲区

                count:缓冲区大小

        返回值:

        0:成功读到文件末尾

        成功:>0读到的字节数

        失败:-1,设置erron

        -1:erron = EAGIN或者EWOULDBLOCK,说明不是read失败,而是read在以非阻塞方式读一个设备文件(网络文件),并且文件无数据。

write函数:

        ssize_t write(int fd,const void *buf,size_t count);

        参数:

                fd:文件描述符(-1,3等)

                buf:存数据的缓冲区

                count:缓冲区大小

        返回值:

                成功; 写入的字节数。

               失败: -1, 设置 errno

用这三个函数实现一个copy函数:

编译运行

可以看到hello4.c与hello.c相同

用fputc和fgetc试试

出现了一个hello.cp文件

二者区别:

read那边的缓冲区一次拷贝1024个字符,(如果拷贝较少的话)会大量进行内核态和用户态的切换,所以非常耗时。

fgetc/fputc有个缓冲区,4096,所以它并不是一个字节一个字节地写,内核和用户切换就比较少

系统调用和库函数比较:

、、、、、、

预读入,缓输出机制。

所以系统函数并不是一定比库函数牛逼,能使用库函数的地方就使用库函数。

标准IO函数自带用户缓冲区,系统调用无用户级缓冲。系统缓冲区是都有的。

、、、、、、

文件描述符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值