1.系统调用
在linux中一切皆文件,文件操作在linux中是十分重要的。为此,linux内核提供了一组用户进程与内核进行交互的接口用于对文件和设备进行访问控制,这些接口被称为系统调用。
2.系统调用io
内核利用文件描述来访问文件。文件描述是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述。读写文件需要使用文件描述符来指定待读写的文件
3.open()函数
(1)open用于创建一个新文件或打开一个已有文件,返回一个非负的文件描述符fd。
0、1、2位系统预定义的文件描述,分别代表STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO
所以,我们打开的文件描述符fd一般是从3开始。
(2)flags参数一般在O_RDONLY(只读打开)、O_WRONLY(只写打开)、O_RDWR(读写打开)中只能选择一个做为参数。
(3)
1.O_CRETA:若文件不存在则创建它,此时需要第三个参数mode,最终创建的文件权限=mode&~umask
2.O_APPEND:每次写时都追加到文件的末端
3.O_NONBLOCK:如果pathname对应是FIO(命名管道)、块特殊文件或字符特殊文件,则该命令使IO操作设定为非阻塞模式
4.O_TUNC:如果此文件存在,且以写方式成功打开,则将文件截断为0
5.O_NOTTY:如果指定的文件使终端设备,则不把此控制终端分配给open函数
6.O_EXCL;如果同时设置了O_CREAT选项,而文件已存在,则使用时用此选项会导致函数返回错误。这种做法可以避免很多进程的并发错误。
什么是umask:
ummask就是影响文件/目录起始权限的一个数字,这个数字可以通过用户输入命令取修改它的。
在linux下,输入命令:umask
0002--->当前系统中默认的umask值
4.测试同一个程序,打开不同文件
结果:
1.如果文件不存在,返回-1,表示打开失败
2.如果文件存在,分别返回一个整数,从小到大
3.发现第一个文件打开时,是从3开始。
4.0分配给了标准输入、1分配给了标准输出、2分配给了标准错误
5.错误函数处理(error)
printf("xxx error: %d\n",error);
把错误码翻译成对应原因
printf("xx error: %s\n",strerror(error));
strerror函数在<string.h>声明
等价方法
perror("open error");
perror函数在<stdio.h>
直接翻译错误,并在前面加入提示语
6.close()函数
close用于关闭一个已打开的文件
int close(int fd);
成功返回0,失败返回-1
7.read函数
ssize_t read(int fd,void *buf,size_t count);
成功返回读到的字节数;若读到文件尾则返回0;读取失败返回-1
1.如果文件的内容长度 >count =》返回值就是count
2.如果文件的内容长度 <count =》返回值是文件实际内容长度+1,+1的原因是buf里面的内容:文件实际自读+'\n'
3.如果文件的内容被读取完成,下次调用时,返回时 0
8.write函数
write的返回值通常与参数count相同,否则表示出错
对于普通文件,write操作从文件的当前偏移量开始
若指定了O_APPEND选项,则每次写之前先将文件偏移量设置到文件尾
成功写入之后,文件偏移量增加实际写的字节数