D3.10
文件I/O的系统调用接口(API)(create、open、close、read、write、lseek)
学习API的方法:(系统调用、文件描述符)
1、
接口定义(函数名、函数形参、函数的返回值、头文件)
2、
测试demo、测试形参和返回值作用;
3、
应用案例;
文件描述符:
特殊的文件描述符:一个程序(进程)会打开3个文件:标准输入0,标准输入1,标准出错2
文件的读写会发生阻塞?(普通文件、目录文件不会发生阻塞,设备文件读写时会阻塞)
当你读取空文件时,会发生阻塞,当你向满文件写数据时,会发生阻塞;
如何将文件设置为非阻塞?(设备文件)
1、
open打开设备文件时(在linux终端输入man 2 open),选择一个选项:O_NONBLOCK
2、
如果文件已打开,可选择fcntl为非阻塞
mmap优缺点:https://blog.csdn.net/Holy_666/article/details/86532671
https://www.cnblogs.com/java-koma/archive/2012/12/01/2797226.html
系统调用:保护内核
缺点:开销比较大;
补充:
ftruncate(fd,10); // ó lseek(fd,10,SEEK_END); write(fd,”\0”,1);拓展文件大小为11
//需要写权限才能拓展文件大小,头文件#include
<unistd.h>#include <sys/types.h>
printf为读操作 scanf也是读操作
od
–tcx 文件名(终端命令)
【fcntl系统调用】
功能描述:根据文件描述词来操作文件的特性。
用法:
int
fcntl(int fd, int cmd);
int
fcntl(int fd, int cmd, long arg);
int
fcntl(int fd, int cmd, struct flock *lock);
参数:
fd:文件描述词。
cmd:操作命令。
arg:供命令使用的参数。
lock:同上。
有以下操作命令可供使用
一. F_DUPFD :复制文件描述词 。
二. FD_CLOEXEC :设置close-on-exec标志。如果FD_CLOEXEC位是0,执行execve的过程中,文件保持打开。反之则关闭。
三. F_GETFD :读取文件描述词标志。
四. F_SETFD :设置文件描述词标志。
五. F_GETFL :读取文件状态标志。
六. F_SETFL :设置文件状态标志。
其中O_RDONLY,
O_WRONLY,
O_RDWR, O_CREAT, O_EXCL, O_NOCTTY 和
O_TRUNC不受影响,
可以更改的标志有 O_APPEND,O_ASYNC, O_DIRECT,
O_NOATIME 和
O_NONBLOCK。
七. F_GETLK, F_SETLK
和 F_SETLKW :获取,释放或测试记录锁,使用到的参数是以下结构体指针:
F_SETLK:在指定的字节范围获取锁(F_RDLCK, F_WRLCK)或者释放锁(F_UNLCK)。如果与另一个进程的锁操作发生冲突,返回 -1并将errno设置为EACCES或EAGAIN。
F_SETLKW:行为如同F_SETLK,除了不能获取锁时会睡眠等待外。如果在等待的过程中接收到信号,会立即返回并将errno置为EINTR。
F_GETLK:获取文件锁信息。
F_UNLCK:释放文件锁。
为了设置读锁,文件必须以读的方式打开。为了设置写锁,文件必须以写的方式打开。为了设置读写锁,文件必须以读写的方式打开。
八. 信号管理
F_GETOWN,
F_SETOWN, F_GETSIG 和
F_SETSIG 被用于IO可获取的信号。
F_GETOWN:获取当前在文件描述词 fd上接收到SIGIO