应用层要访问操作系统层要经过一个系统调用(API接口)。
系统调用:提供给用户的一组“特殊”的接口,来获得操作系统内核提供的服务。
为什么不能直接访问操作系统?
因为当用户直接访问操作系统层时,用户可能会更改操作系统里面的内容,造成操作系统崩溃,所以为了保护操作系统。
Linux 文件分为:
(1)普通文件:计算机用户和操作系统用于存放数据、程序等信息的文件。普通文件
一般又分为文本文件和二进制文件。
(2)目录文件:Linux文件系统将文件索引节点号和文件名同时保存在目录中,所以目录文件就是将文件的名称和它的索引节点号结合在一起的一张表。目录文件只允许系统进行修改,用户进程可以读取目录文件,但不能对他们进行修改。
(3)链接文件:又称符号链接文件,它提供了共享文件的一种方法。在链接文件中不是通过文件名实现文件共享的,而是通过链接文件中包含的指向文件的指针来实现对文件的访问的。使用链接文件可以访问普通文件、目录文件和其他文件。
(4)设备文件:Linux把所有的外设都当成文件来看待,每一种I/O设备对应一个设备文件并存放在/dev目录中。
Linux文件描述符
当某个程序打开文件时,操作系统返回相应的文件描述符,程序为了处理该文件必须引用此描述符。
文件描述符是一个非负整数。
一个文件进程的启动,都会打开三个文件:标准输入、标准输出、标准错误
三个文件对应的文件描述符:
0:表示标准输入
1:表示标准输出
2:表示标准错误
不带缓存的I/O操作
1:creat函数
函数的作用:创建一个文件。
函数的原型:int creat(const char *pathname, mode_t mode);
函数的功能:
Pathname:创建的文件名(包含路径)。如“home/hello.c”.
Mode:创建的模式
常用的模式:
S_IRUSR 可读
S_IWUSR 可写
S_IXUSR 可执行
文件头:#include <sys/types.h>、#include <sys/stat.h>、#include <fcntl.h>
返回值: 成功: 返回新的文件描述符。
出错: 返回 -1.
2:Open函数
函数作用:打开一个文件。
函数原型:int open(const char *pathname, int flag)(文件存在时)
Int open(const chat *pathname, int flag, mode_t mode )(文件不存在时)
各参数功能:
Flag打开旗标:
O_RDONLY 以只读 O_CREAT 打开的文件不存在则创建
O_WRONLY 以只写 O_APPEND 以追加形式写(从结尾写)
O_RDONLY 以可读写 O_TRUNC 如果文件有,就清空文件
O_NONBLOCK 以非阻断方式打开文件
Mode模式:
S_IRWXU :(0700)表示该文件所有者可读可写可执行
S_IRUSR :(00400)表示该文件所有者可读
S_IWUSR:(00200)表示该文件所有者可写
函数返回值:
成功:返回新的文件描述符
出错:返回 -1.
3:Read函数
函数的作用:从打开的文件中读取数据
函数的原型:ssize_t read(int fd, void *buf, size_t count);
函数的头文件:#include <unistd.h>
函数的返回值:
正常的是实际读到的字节数。
如果在文件结束或者是无数据时,返回0
出错:返回 -1.
4:write函数
函数的作用:想打开的文件写数据
函数的原型:ssize_t write(int fd, woid *buf, size_t count);
函数的头文件:#include <unistd.h>
函数的返回值:
成功:返回实际写入的字节数
出错:返回 -1.
5:lseek函数
函数的作用:定位文件的位置
函数的原型:int lseek(int fd, offset_t offset, int whence);
函数的功能:将文件读写指针相对whence移动offset字节,,操作成功时,返回文件
指针相对于文件头的位置。
函数的返回值:
成功:返回文件当前指针到文件头有多少个字节
出错:返回 -1.
6:close函数
函数的作用:关闭已经打开了的文件
函数的原型:int close(int fd);
函数的返回值:
成功:返回0
出错:返回EOF并把错误代码存到errno中。
***不带缓存的I/O是对文件描述符的。
***带缓存的I/O是对文件流的。
带缓存的I/O操作
三种类型的缓冲:
1:全缓冲:在填满标准I/O缓冲区后才进行实际的I/O操作。
2:行缓冲:当在输入和输出中遇到换行符时,标准I/O库执行I/O操作。这允许我们一次输出一个字符,但只有在写了一行之后才进行实际I/O操作。
3:无缓存:标准I/O库不对字符进行缓冲存储。标准出错流(stderr)通常是不带缓存的。
1:fopen函数
函数的作用:用于打开一个文件
函数的原型:FILE *fopen(const char *pathname, char *mode);
各参数的作用:
Mode:
“r”:读文件,文件必须存在。
“r+”: 打开可读写,文件必须存在。
“w”:打开只写文件,文件不存在则创建;文件存在,原来文件清零。
“w+”:打开可读写文件;文件不存在则创建;文件存在,原来文件清零。
“a”: 附加的形式打开写文件,文件不存在则创建,存在写在文件尾。
“a+”: 附加的形式打开可读写文件,文件不存在则创建,存在写在文件尾。
函数的头文件:#include <stdio.h>
函数的返回值:
成功:返回指向文件流的指针。
出错:返回NULL。
2:fputc函数
函数的作用:讲一个指定的字符写入到文件流中。
函数的原型:int fputc(int c, FILE *stream);
函数的返回值:
成功:返回字符c
失败:返回EOF。
3:fgetc函数
函数的作用:从文件流中读取一个字符。
函数的原型:int fgetc(FILE *stream);
函数的返回值:
返回值正常的是读取的字符。
EOF表示到了文件尾。
4:fputs函数
函数的作用:将一指定的字符串写入文件里。
函数的原型:int fputs(const char *s, FILE *stream);
函数的返回值:
成功:返回写成功的字符数。
失败:EOF表示出错。
5:fgets函数
函数的作用:从文件中读一个字符串。
函数的原型:char fgets(char *s, int size, FILE *stream);
函数的参数:
从stream中读size-1个字符到s中。
函数的返回值:
成功:返回s。
出错:返回NULL。
6:fread函数
函数的作用:从文件流中读取数据块。
函数的原型:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
函数的返回值:
返回实际读到的nmemb(数据块)的数目,比nmemb小的话,可能到文件
尾,或者错误发生。
Feof:到文件尾。
Ferror:判断错误。
7:fwrite函数
函数的作用:将数据写到文件流中。
函数的原型:size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
函数的返回值:
返回实际写入的nmemb(数据块)的数目。
8:fseek函数
函数的作用:移动文件流的读写位置。
函数的原型:int fseek(FILE *stream, long offset, int whence);
函数的返回值:
调用成功:返回0.
调用出错:返回 -1.
****使用ftell来获取当前位置。
9:ftell函数
函数的作用:读取文件流的读写位置。
函数的原型:long ftell(FILE *stream);
函数的返回值:
成功:返回当前的读写位置。
出错:返回 -1。
10:feof函数
函数的作用:检查文件流是否到了文件尾。
函数的原型:int feof(FILE *stream);
函数的返回值:
非零代表到了文件尾。
其他是0.
11:fprintf函数
函数的作用:格式化输出数据至文件。
函数的原型:int fprintf(FILE *stream, const charr *format.......);
函数的返回值:
成功:返回实际输出的字符数。
失败:返回 -1。
12:fscanf函数
函数的作用:格式化字符串输入。
函数的原型:int fscanf(FILE * stream, const char *format.......);
函数的返回值:
成功:返回参数的数目。
出错:返回 -1。