文件系统
在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

被折叠的 条评论
为什么被折叠?



