- 所谓系统调用是指操作系统提供给用户的一组特殊接口,用户程序可以通过这组特殊的接口来获得操作系统内核提供的服务;
- 由于在Linux中,为了更好的保护内核空间,将程序的运行空间分为内核空间和用户空间(也就是常说的内核态、用户态),它们分别运行在不同的级别上,在逻辑上是相互隔离的。因此用户进程在通常情况下不允许访问内核数据,也无法使用内核函数,它们只能在用户空间操作数据,调用用户空间的函数。
- 系统调用并不是直接与程序员进行交互的,它仅仅是一个通过软中断机制向内核提交请求,以获得内核服务的接口。他实际使用中程序员调用的通常是用户编程接口——API;
- 系统命令相对API更高了一层,它实际上一个可执行的程序,他的内部引用了编程接口(API)来实现相应的功能;
- 文件描述符是一个非负整数,它是一个索引值,并指向内核中每个进程的记录表(即在内核中有一个文件记录表,当打开一个文件后,该文件的基本信息就会被存储到该文件记录表的一行里面,返回行号共调用查看);一个进程启动时,都会打开三个文件:
标准输入 | STDIN_FILENO | 0 |
标准输出 | STDOUT_FILENO | 1 |
标准出错处理 | STDERR_FILENO | 2 |
6.头文件,系统调动函数具有5个头文件
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
7. creat:创建文件
int creat(const char *filename,mode_t mode);
注意:①函数名是creat,不是create,没有e;②const char *filename是字符串,需要用双引号括起来;
参数:filename:创建的文件名(包含路径,缺省为当前路径);
mode:创建模式,主要有以下几种:
S_IRUSR | 可读 | 4 |
S_IWUSR | 可写 | 2 |
S_IXUSR | 可执行 | 1 |
S_ISRWU | 可读、可写、可执行 | 7 |
既可以采用表中的宏定义(系统已经定义好),也可以采用后面的数字表示,0753:0无实际意义,7代表用户自己具有可读可写可执行的权限,5代表组内用户具有可读可执行的权利,3代表组外用户具有可写可执行的权利;与Linux中文件属性类似;
返回值:>0的整数,代表创建成功,返回文件描述符;
-1:代表创建失败(利用strerror、perror可以查看错误原因);
8. open :打开文件
int open(const char *pathname, int flags);
int open(const char *pathname,int flags,mode_t mode);
参数:const char *pathname是文件路径和文件名,需要用双引号括起来;
mode:与creat一样,只在形式2中使用;
flags:分为必选项和可选项,表示文件打开的方式:
必选项,只能选1个 | O_RDONLY | 只读打开 |
O_WRONLY | 只写打开 | |
O_RDWR | 可读、可写打开 | |
O_APPEND | 追加写(文件指针在末尾) | |
可选项 | O_CREAT | 不存在则创建(只适用于形式2) |
O_CREAT/OEXCL | 不存在就创建,存在就报错 | |
O_NONBLOCK | 非阻塞方式,阻塞是指如果读到立刻返回,没读到就等待默认,直到读到字符; | |
O_TRUNC | 打开文件后,将文件清空,需要配合“写”操作(可适用于通讯录的保存功能函数中打开数据文件); |
一般情况下不会用creat命令,而是使用open创建,使用“O_TRUNC|O_WRONLY|O_CREAT”就等同与creat;
返回值是文件描述符(非负整数,即在文件表中的行号);
9. close:关闭文件
int close(int fd)
参数:fd是文件描述符,来自于open的返回值;
10. read:读文件
int read(int fd, const void *buf, size_t length)
功能:从文件描述符fd所指定的文件中读取length个字节到buf所指向的缓冲区中(数组),返回值是实际读取的字节数;
文件→数组;
11. write:写文件
int write(int fd, const void * buf, size_t length)
功能:把length个字节从buf指向的缓冲区中写到文件描述符fd所指向的文件中,返回值是实际写入的字节数;
数组→文件;
12. lseek :定位文件
int lseek(int fd, offset_t offset, int whence)
功能:将文件读写指针相对于whence移动offset 个字节,操作成功时,返回文件指针相对于文件头的位置。
参数:offset可取负值,表示向前移动,例如lseek(fd, -5, SEEK_CUR)表示将文件指针相对于当前位置向前移动5个字节;
whence有三种模式:
SEEK_SET | 相对于文件开头 |
SEEK_CUR | 相对文件读写指针的当前位置 |
SEEK_END | 相对文件末尾 |
lseek(fd, 0, SEEK_END):由于lseek函数的返回值为文件指针相对于文件头的位置,因此下面调用的返回值就是文件的长度;