Unix-第三章文件操作

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值