文件系统
在linux下面 一切设备皆文件
open/read/write/ioctl/close
C语言标准库里 操作文件的函数
fopen fread fwrite fclose ftell fseek fprintf fscanf fputs fgets …
FILE * 文件指针 结构体指针
open 打开 或者 创建并打开文件
create 创建新文件
close 关闭文件
read 读文件
write 写文件
lseek 调整文件读写位置
fcntl 文件属性控制
unlink 删除硬链接
rmdir 删除空目录
remove 删除硬链接 或者 空目录
mmap( ,int fd,off_t offset);
文件描述符
1.非负整数
2.打开一个文件就会相对应产生一个文件描述符
3.通过open函数返回 被内核空间记录
4.每个进程会默认提供三个文件描述符
0 STDIN_FILENO
1 STDOUT_FILENO
2 STDERR_FILENO
stdin 标准输入
stdout 标准输出
stderr 标准错误输出
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
int open(const char *pathname, int flags,...);
flag:
O_RDONLY
O_WRONLY
O_RDWR
O_CREAT
O_EXCL 如果文件存在则失败
O_TRUNC 清空
O_APPEND
mode_t:
权限
rwx 7
rw- 6
r-x 5
r-- 4
-wx 3
-w- 2
--x 1
--- 0
属主 组 其它
非 非阻塞
阻 阻塞
同 同步
异 异步
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
size_t fwrite(const void *buf,size_t size,size_t nmemb,FILE *fp);
off_t fssek(FILE *fp,off_t offset,int whence);
off_t lseek(int fd, off_t offset, int whence);
whence:
SEEK_SET
SEEK_CUR
SEEK_END
ssize_t read(int fd, void *buf, size_t count);
C语言标准库里 操作文件的函数
fopen fread fwrite fclose ftell fseek fprintf fscanf fputs fgets …
底层实现open/read/write/fcntl/close/lseek/…
输出缓存区
输入缓存区
提升读写效率 降低了实时性
程序写 ->fwrite->缓存区(到达一定情况下)->write->磁盘文件
程序写 ->write->磁盘文件
write用户态
写入磁盘 内核态
每一次调用write都会进行用户态和内核态的切换 频繁地进行用户态和内核态场景的切换
time 命令 可以测试 程序在运行所需要时间
real 总执行时间
user 用户空间执行时间
sys 内核空间执行时间
real = user+sys
strace 命令 跟踪系统调用
size 命令
text 代码区大小
data 数据段大小
bss bss区大小
dec 上面三个总大小 十进制
hex 十六进制总大小
filename 文件名
nm
ldd
ldconfig
objdump
strip
I/O input output 输入/输出
ftell fseek --> lseek
int fcntl(int fd, int cmd, … /* arg */ );
文件锁 (对不同的进程才有意义):
读锁 F_RDLCK: 共享锁 可以上很多读锁
写锁 F_WRLCK: 独占锁 只允许上一把写锁 不能再上读锁 和 写锁
解锁 F_UNLCK
同一个进程可以上任意把任意锁
linux文件系统
一切设备皆文件
open/close/read/write/fcntl/ioctl
unix c 知识体系 理论知识
文件描述符
非负整数
进程为记录每一个打开的文件
fcntl
F_DUPFD
F_GETFL
F_SETFL
F_GETLK 测试锁 测试是否可以上锁 把锁的状态更新为F_UNLCK表示可以上锁 返回锁的信息
F_SETLK 上锁 立即返回
F_SETLKW 上锁直到成功
struct flock{
l_type 锁类型:F_RDLCK F_WRLCK F_UNLCK
l_whence 锁的起始参考位置 SEEK_SET SEEK_CUR SEEK_END
l_start 偏移参数位置的距离
l_len 锁的长度 0 到文件末尾
l_pid 上锁的进程号 -1自动填充
}
fcntl(fd,F_GETFL,struct flock *lock)
读锁 共享锁
写锁 独占锁
同步(上锁):
访问有先后顺序
异步(没上锁):
各自干各自的
权限屏蔽码
普通文件默认的权限0666(rw-rw-rw-) - 权限屏蔽码(0000)
0666-0441 = 0226 rw- --x
-w–w-rw-
umask 0331 设置权限屏蔽码
chmod u/g/o + rwx 0777
进程: 一个程序运行之后
终端:是一个进程
父子进程
在终端上运行一个程序
终端 父进程
a.out 子进程 (继承父进程的权限屏蔽码)
stat fstat lstat
chown fchown lchown
int open(const char *pathname, int flags, mode_t mode);//创建文件并打开
int creat(const char *pathname, mode_t mode);//创建文件并打开
int mkdir(const char *pathname, mode_t mode);//创建空目录
int rmdir(const char *pathname);//删除空目录 (不能删除非空目录)
int link(const char *oldpath, const char *newpath);//创建硬链接
int unlink(const char *pathname);//删除硬链接
int remove(const char *pathname);//删除文件和unlink一样,删除目录和rmdir一样
int rename(const char *oldpath, const char *newpath);//修改目录或文件名字
int symlink(const char *oldpath, const char *newpath);
ssize_t readlink(const char *path, char *buf, size_t bufsiz);
char *getcwd(char *buf, size_t size);
char *getwd(char *buf);
char *get_current_dir_name(void);
open打开目录是可以的 但不能进行读写
文件描述符 可以用于 fstat fchown fchdir fdopendir
•opendir/fdopendir: 打开目录流
•closedir: 关闭目录流
•readdir: 读取目录流
•rewinddir: 复位目录流
•telldir: 获取目录流当前位置
•seekdir: 设置目录流当前位置
文件系统
open/create/read/write/fcntl/close
dup/dup2
async/fsync/fdatasync
文件锁
读锁 共享锁
写锁 独占锁
锁对于不同的进程才有作用
stat/fstat/lstat
access
umask
代表了一种设计理念:永远成功 返回旧的 (做完事情已后 用于恢复)
chmod fchmod
chowd fchowd lchowd
symlink readlink
mkdir
rmdir
link
unlink
remove
rename
truncate ftruncate
chdir fchdir getcwd
opendir
fdopendir
readdir
closedir
rewinddir
seekdir
telldir