系统调用(内核提供的函数) ;
open函数的真正系统调用函数 sys_open;
read函数的真正系统调用函数 sys_read;所以真正open read函数严谨的来说不叫系统调用叫系统函数,sys_read sys_open是系统调用,两种基本没区别,就是换了一个壳;
内核里头主要是驱动最后会对应到硬件的各个部件 ;
如:printf(“hello”);需要打印到显示屏上需要通过系统调用进入内核,再通过内核的各个驱动(显卡驱动),将hello打印到公屏;
1.open函数:
头文件:#include<unistd.h>//unix标准头文件
int open(const char *pathname, int flags);//(目标文件的路径,打开方式:O_RDONLY, O_WRONLY, O_RDWR,O_CREAT, O_EXCL(判断是否存在),O_NOCTTY, and O_TRUNC(清零))这几个参数的宏在#include<fcntl.h>里file control;
int open(const char *pathname, int flags,mode_t mode);//多了个权限,如:0644 rw-r–r– 第一个零表示8进制
这个会受到umask的影响,比如输入指令umask系统给一个0002,那么当 mode = 0777时,最后生成的文件属性为0775
公式为:文件权限 = mode & ~umask;
errno 在 #include<errno.h>//常见的有0,2
strerrno 在#include<string.h>//描述errno代表的意思
通过man可知,flags参数的取值有三个 (manpage可以看20篇,英文不懂就查)
2.read write函数:
ssize_t read(int fd, void *buf, size_t count);
ssize_t一个有符号的数
fd:文件描述符
buf:存数据的缓冲区
count:缓冲区的大小
返回值:
0 : 读到了文件的末尾(可用作while循环的条件)
成功: 读到的字节数
失败: – 1 设置errno
-1:并且 errno = EAGIN 或 EWOULDBLOCK 不是read失败而是read以非阻塞方式在读一个设备文件或者网络文件,并且文件无数据。
ssize_t write(int fd, const void *buf, size_t count);
参数:
fd:文件描述符
buf:代写出数据 的缓冲区
count:数据大小
返回值:
成功:写入的字节数
失败:- 1 并设置errno
perror(“这里写出错时给自己的提示”);如open函数只读打开一个不存在的文件,这里写perror(“open error”);提示自己错误在这里,是open出了差错。
strerror(errno);翻译errno给的数是什么意思,在string.h中
库函数是不能进内核空间的,不能进就无法操作内核里的设备驱动无法达到交互的效果,所以用库函数最终还是回调用系统函数来进入内核空间。