系统调用:所谓的系统调用时指操作系统提供给用户的一组特殊的接口,用户程序可以通过这组特殊的接口来获得内核提供的服务。例如内核可以通过进程控制相关的系统调用来创建进程,实现进程调度,进程管理等。
为什么用户程序只有通过系统调用才能享受内核提供的服务呢?在linux系统中为了更好的保护内核空间,将程序的运空间分为内核空间和用户空间(也就是常说的内核态和用户态)。他们分别运行在不同的级别上,在逻辑上时相互分离的,因此用户程序无法访问内核数据,也无法访问内核的函数,他们只能在用户空间操作用户空间的数据,访问用户空间的函数。
但是,在某些特殊情况下用户空间的进程需要获得系统服务(调用内核空间的程序),系统调用规定用户进程进入内核空间的具体位置。进行系统调用时程序运行空间需要从用户空间进入到内核空间,处理完数据在返回用户空间
Linux系统调用(只有250个左右),这些系统调用按照功能逻辑大致可分为进程控制,进程间的通信,文件系统控制,系统控制,存储管理,网络管理,socket控制,用户管理几类。
用户编程接口API
系统调用并不是直接与程序员交互的,它仅仅是提供一个软中断的机制向内核提供请求,以获得内核服务的接口。在实际应用中调用的是通常是用户编程接口--API。并不是所有的API函数都一一对应一个系统调用,有事一个API函数的功能需要几个系统调用来共同合作才能完成函数的功能。甚至还有一些API函数不需要调用系统调用(因此他所完成的不是内核提供的服务)。
在Linux中,用户编程接口API遵循了在UNIX中最流行的应用编程界面标准---POSIX标准。
系统命令:系统命令相对于API更高一层,他实际上时一个可执行程序,他的内部引用了用户编程接口API来实现相应的功能。
Linux文件和文件描述符:
在Linux中对目录和设备的操作等同于文件的操作。因此大大简化了系统对不同设备的处理。Linux文件分为四类:普通文件,目录文件,连接文件,设备文件。
对于Linux而言,所有对设备和文件的操作都使用文件描述符来进行的。
不带缓存的文件I/O操作:(open close write read sleek )
这里的不带缓存是指:每个函数只调用系统中的一个函数。
(1)open close函数说明:
open函数用于打开和创建文件,在打开或创建文件时可以指定文件的属性及用户的权限各种参数。
close关闭一个打开的文件。当一个进程终止时,由打开的所有的文件都由内核自动关闭看所有很多程序使用这一功能而不显示的关闭一个文件。
int open(char *pathname , flag , int perms);
patname 打开文件的文件名包过目录名。
flags:文件打开方式。 O_RDONLY, O_WRONLY , O_RDWR ,O_CREAT,O_EXCL,O_NOCTTY,O_TRUNC,O_APPEND
perms: 被打开文件的存钱权限,为8进制表示法.
O_EXCL 若使用O_CREAT是文件存在,则返回错误信息。可用于判断文件是否存在。
O_TRUNC 如果文件已经存在,并且以只读或只写成功打开,那么回删除文件中原有的所有数据
O_APPEND 以添加方式打开文件,在打开文件的同时文件指针指向文件的末尾。
int close(int fd);
fd 文件描述法, 返回值 0 成功1 出错。
ssize _t read(int fd,void *buf,size_t count)
fd :文件描述符
buf:指定存储器读出数据的缓冲区
count:指定读出的字节数。
返回值:成功:读到的字节数 0:已达文件尾 -1出错。
ssize_t write(int fd, void *buf, count)
fd:文件描述符
buf:指定存储器写入数据的缓冲区
count:指定读出的字节数。
返回值:成功:写入的字节数 -1 出错。
off_t lseek(int fd , off_t offset, int whence)
fd:文件描述符
offset:偏移量,每一读写操作所需要移动的距离,单位是字节的数量,可正可负(向前移,向后移)
whence: SEEK_SET当前位置为文件的开头,新位置为偏移量的大小
SEEK_CUR当前位置为文件指针的位置,新位置为当前位置加上偏移 量
SEEK_END 当前位置为文件的结尾,新位置为文件的大小加上偏移量的大小。
open close write read lseek 实现文件的 打开 关闭 读写 等基本操作。