Linux—文件编程(系统调用、用户编程接口API)

  1. 所谓系统调用是指操作系统提供给用户的一组特殊接口,用户程序可以通过这组特殊的接口来获得操作系统内核提供的服务;
  2. 由于在Linux中,为了更好的保护内核空间,将程序的运行空间分为内核空间和用户空间(也就是常说的内核态、用户态),它们分别运行在不同的级别上,在逻辑上是相互隔离的。因此用户进程在通常情况下不允许访问内核数据,也无法使用内核函数,它们只能在用户空间操作数据,调用用户空间的函数。
  3. 系统调用并不是直接与程序员进行交互的,它仅仅是一个通过软中断机制向内核提交请求,以获得内核服务的接口。他实际使用中程序员调用的通常是用户编程接口——API;
  4. 系统命令相对API更高了一层,它实际上一个可执行的程序,他的内部引用了编程接口(API)来实现相应的功能;
  5. 文件描述符是一个非负整数,它是一个索引值,并指向内核中每个进程的记录表(即在内核中有一个文件记录表,当打开一个文件后,该文件的基本信息就会被存储到该文件记录表的一行里面,返回行号共调用查看);一个进程启动时,都会打开三个文件:        
标准输入STDIN_FILENO0
标准输出STDOUT_FILENO1
标准出错处理STDERR_FILENO2

     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函数的返回值为文件指针相对于文件头的位置,因此下面调用的返回值就是文件的长度;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值