Linux系统学习
Linux系统提供的基本的API指令:
打开-open
读写-write/read
光标定位- lseek
关闭- close
1、open
open函数的定义
也可以在linux系统的终端输入 man 2 open来查看open函数的介绍与描述。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);.
返回值
open函数的返回值如果操作成功,它将返回一个文件描述符,如果操作失败,它将返回-1。
参数含义:
pathname:要打开的文件名,包含文件路径
flags:执行权限
只能是下列3个模式其中一种操作文件
O_RDONLY:只读模式
O_WRONLY:只写模式
O_RDWR:可读可写
以下的常量是选用的,这些选项是用来和上面的必选项进行按位或起来作为flags参数。
O_APPEND 表示追加,如果原来文件里面有内容,则这次写入会写在文件的最末尾。
O_CREAT 表示如果指定文件不存在,则创建这个文件
O_EXCL 表示如果要创建的文件已存在,则出错,同时返回 -1,并且修改 errno 的值。
O_TRUNC 表示截断,如果文件存在,并且以只写、读写方式打开,则将其长度截断为0。
O_NOCTTY 如果路径名指向终端设备,不要把这个设备用作控制终端。
O_NONBLOCK 如果路径名指向 FIFO/块文件/字符文件,则把文件的打开和后继 I/O设置为非阻塞模式(nonblocking mode)
如 O_RDWR | O_CREAT 等
mode:文件访问权限的初始值
文件权限由open的mode参数和当前进程的umask掩码共同决定。可以用chmod XXX指令去更改文件权限。
第三个参数(mode)是在第二个参数中有O_CREAT时才作用,如果没有,则第三个参数可以忽略。
从来源来分,这两者很好区分:
open函数是Unix下系统调用函数,操作成功返回的是文件描述符,操作失败返回的是-1,
fopen是ANSIC标准中C语言库函数,所以在不同的系统中调用不同的内核的API,返回的是一个指向文件结构的指针。
open函数与fopen函数区别
同时open函数没有缓冲,fopen函数有缓冲,open函数一般和write配合使用,fopen函数一般和fwrite配合使用
2、write/read
#include <unistd.h>
ssize_t write (int fd, void *buf, size_t count);
函数定义:ssize_t write (int fd, const void * buf, size_t count);
fd:
打开的设备或文件描述符
buf:
缓冲区
count:
是写入的字节数
函数说明:write()会把参数buf所指的内存写入count个字节到参数fd所指的文件内。
返回值:如果顺利write()会返回实际写入的字节数(len)。当有错误发生时则返回-1,错误代码存入errno中。
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
函数定义:ssize_t read(int fd, void * buf, size_t count);
fd:
打开的设备或文件描述符
buf:
缓冲区
count:
是读取的字节数
函数说明:read()会把参数fd所指的文件传送count 个字节到buf 指针所指的内存中。
返回值:返回值为实际读取到的字节数, 如果返回0, 表示已到达文件尾或是无可读取的数据。若参数count 为0, 则read()不会有作用并返回0。
注意:在用write写入数据后,光标位置位于write写入数据的后面,此时直接read读取数据,则读取位置在写入数据之后,此时将读不到数据。可以通过移动光标位置或者close设备/文件 在重新open设备/文件 此时光标重新回到设备/文件的头,然后 再进行read读取。
3、lseek
#include <unistd.h>
#include <sys/types.h>
off_t lseek(int fd, off_t offset, int whence);
函数定义:off_t lseek(int fd, off_t offset, int whence);
fd:
打开的设备或文件描述符
offset:
对whence的偏移值
whence:
参数 offset 的含义
如果whence可为以下3个值
SEEK_SET(指向文件头):文件头新增加offset 个位移量
SEEK_CUR(当前光标位置):当前位置往后增加offset 个位移量.
SEEK_END(指向文件尾):文件尾后再增加offset 个位移量
lseek( fd, 0, SEEK_END);
可以用来计算文件大小
函数说明:fseek()用来移动文件流的读写位置.
返回值:当调用成功时则返回目前的读写位置, 也就是距离文件开头多少个字节. 若有错误则返回-1, errno 会存放错误代码.
4、creat
函数定义:int creat(const char * pathname, mode_tmode)
filename:要创建的文件名(包括路径,默认当前路径)
mode:指定用户初始操作权限
文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。
习惯上,标准输入(standard input)的文件描述符是 0,标准输出(standard output)是 1,标准错误(standard error)是 2。
稍微记录下Linux系统文件操作的基本API及其相关参数,如有问题,麻烦大佬指正。