open函数
manpage 第二卷,open函数如下,有两个版本的
返回一个文件描述符,理解为整数,出错返回-1
pathname 文件路径
flags 权限控制,只读,只写,读写。 O_RDONLY, O_WRONLY, O_RDWR
、、、、、、
第二个open
多了一个mode参数,用来指定文件的权限,数字设定法
文件权限 = mode & ~umask(进行按位与操作)
、、、、、、
以只读方式打开,文件没有就创建一个文件
、、、
open常见错误:
- 打开文件不存在
- 以写方式打开只读文件(权限问题)
- 以只写方式打开目录
当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函数自带用户缓冲区,系统调用无用户级缓冲。系统缓冲区是都有的。
、、、、、、