Linux---文件操作函数&用户核态切换

(一)文件操作函数

(1)open:建立了一条到文件或设备的访问路径,成功将返回一个可被read、write其他系统调用使用的文件描述符。

#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
int open(char*dpath,int flag, /*mode_t mode*/):
成功返回新得文件描述符,失败返回-1并设置全局变量errno指明失败原因

文件描述符唯一,不与其他进程共享。若两个程序同时打开一个文件,他们会分别得到两个不同的文件描述符,都对文件进行写操作,会各写各的不会,分别接着上次离开的位置往下写,不会交织,而是覆盖.

flag参数:必须文件访问模式 + 可选模式(用按位或操作)

使用带O_CREAT标志创建文件必须使用带mode参数的open函数,mode是几个标志“按位或”后得到的。

例如:

open(“myfile”,O_CARET,S_IRUSR|S_IXOTH);
创建myfile文件,文件属主用于读权限,其他用户拥有执行权限,且只设置了这些权限。

对访问权限产生影响的因素有两种:

  1. 指定访问权限在创建时才会使用;
  2. 用户掩码(uamsk)

举例:用户雅掩码为001,并且指定S_IXOTH,那么其他用户不会拥有执行权限,因为umask不允许。所以open、create调用中的标志实际上是发出设置请求,决定权在umask的值。

umask:系统变量。作用是当文件创建时为文件的访问权限设定一个掩码。

由三个数组成:用户(user)组(grap)其他用户(other;每个数字有四种选择:0(任何权限)4(读权限)2(写权限)1(执行权限)。

(2)create:创建一个新文件

#include<fcntl.h>
int creat(const char *pathname, mode_t mode);
返回值:成功返回为只写打开的文件描述符,出错返回-1
次函数等效于:
open(pathname,O_WRONLY|O_CREAT|O_TRUNC,mode);

(2)read:从文件描述符fildes相关联的文件里读入nbytes 个字节数据并放到buf中,返回读入的个数

#include<unistd.h>
size_t read(int fildes,void *buf,size_t nbytes);

(3)write:把缓冲区的buf的前nbytes个字节写入与文件描述符相关联的文件中,返回实际写入的个数。

#include<unsitd.h>
size_t write(int fildes,void *buf,size_t nbytes);

(4)close:终止文件描述符fildes与其对应文件之间的关联。文件描述符被释放并能够重新使用。

#include<unsitd.h>
int close(int fildes);
成功返回0,失败返回-1

父进程打开的文件子进程也能共享。

(5)lseek:对文件描述符fildes的读写指针进行设置,通俗来说设置文件下一个读写位置,既可以是绝对位置,也可以是相对位置或者文件的摸个相对位置。

#include<sys/types.h>
#include <unsitd.h>
off_t lseek(int fildes,off_t offset,int whence);
成功返回文件头到文件指针被设置处的字节偏移值,失败返回-1。

off参数用来指定位置:

whence参数:定义该偏移值用法

SEEK_SET:offset是一个绝对位置

SEEK_CUR:offset是一个相对于当前位置的一个相对位置

SEEK_END:offset是一个相对于文件尾的一个相对位置。

(二)获取文件属性函数

fast系统调用:返回与打开文件描述符相关的文件状态信息,该信息存放在buf结构中,buf地址从参数传给fast

#include<unistd.h>
#include<sys/stat.h>
int stat(const char *restric pathname,struct stat* restruct buf);
int fstat(int fildes,struct stat* buf);
int lstat(const char *restric pathname,struct stat* restruct buf);
三个函数的返回值:若成功则返回0,若出错则返回-1

一旦给出pathname,stat函数就返回与此命名文件有关的信息结构。fstat函数获取已在描述符filedes上打开文件的有关信息。lstat含税类似于stat,但是当命名的文件是一个符号链接时,lstat返回该符号链接的有关信息,而不是由该符号链接引用文件的信息。

(三)扫描目录函数

(二)系统调用函数&库函数

系统调用函数:系统内核抛出来给用户空间调用的接口。系统调用函数由用户态调用,在内核态执行。

库函数:在库函数实现,在用户态调用,执行时在用户态执行。但是有些库函数需要想换掉系统调用函数。

库函数与系统调用函数的区别:

  • 库函数:在函数库文件中
  • 系统调用函数:在系统内核中实现。

(三)内核态&用户态

内核态:操作系统内核空间,拥有操作系统最高权限。

用户态:用户空间,最低权限。

以open系统调用函数为例:

  • 系统调用函数出发0X80中断
  • 保存程序上下文
  • 并且将系统调用号存储在eax寄存器,然后陷入内核,内核开始执行中断处理程序(内核),再系统调用表中查找系统调用号对应的系统内核函数并调用,执行完成后将返回值通过eax将返回值传递回用户空间。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值