系统调用
系统调用是操作系统提供给用户的一组“特殊接口”。系统调用并非直接和程序员或系统管理员直接打交道,而是通过软中断的方式向内核提交请求,从而获取内核函数的服务入口(系统调用表)。系统调用让系统从用户空间进入内核空间内运行,运行后将结果返回给应用程序(内核态->用户空间)。
系统调用和系统API等区别
系统API
主要是通过C库libc来实现,程序员多采用这种方式与内核交互,这些API通过系统调用来实现
系统命令
系统管理员采用系统命令与内核交互,是一个可执行文件,通过系统API及系统调用来实现
外壳程序
一系列系统命令和SHELL脚本共同组合成的程序。
函数库调用 与 系统调用
文件描述符
-每个进程PCB结构中有文件描述符指针,指向files_struct的文件描述符表,记录每个进程打开的文件列表
-系统内核不允许应用程序访问进程的文件描述符表,只返回这些结构的索引即文件描述符ID(File Description)给应用程序
-Linux系统中,应用程序通过这些文件描述符来实现让内核对文件的访问
-每个进程能够访问的文件描述符是有限制的,通过#ulimit –n可以查看
特殊文件描述符
标准输入STDIN_FILENO
标准输出STDOUT_FILENO
标准错误STDERR_FILENO
每个进程被加载后,默认打开0,1,2这三个文件描述符
open
-函数原型
int open(const char *path, int flags,mode_t mode);
-参数
path :文件的名称,可以包含(绝对和相对)路径
flags:文件打开模式
mode: 用来规定对该文件的所有者,文件的用户组及系统中其他用户的访问权限,则文件权限为:mode&(~umask)
-返回值
打开成功,返回文件描述符;
打开失败,返回-1
打开方式
访问权限
O_CREATE会产生特殊权限,需要设置访问权限:
S_IRWXU等价于 S_IRUSR|S_IWUSR|S_IXUSR (文件所有者)
S_IRWXG 等价于 S_IRGRP|S_IWGRP|S_IXGRP (文件用户组)
S_IRWXO 等价于 S_IROTH|S_IWOTH|S_IXOTH (文件其他用户)
close
关闭文件close(将进程中fd对应的文件描述表结构释放):
函数原型:int close(int fd); //如果出现错误,返回-1;调用成功返回0
read
-函数原型:
int read(int fd, void *buf, size_t nbytes);