Linux下的文件读写

一、系统调用
应用程序(打开文件)-》各种库(标准库fopen)-》系统调用(open)-》内核(驱动)-》硬件(磁盘)。
系统调用:内核提供给外界访问的接口函数,调用这些函数将使进程进入内核态。
1、UNIX、Linux大部的系统功能都是功能是通过系统调用的方式提供的。
2、这些系统调用被封装成了C函数的形式,但它们并不是C语言的一部分,也不是函数(它是通过向内核发"信号"的方式告诉内核,我要进行系统调用,然后内核执行相应的功能,然后再把执行后的结果告诉进程)。

time cmd 测试程序的运算时间
size cmd 测试程序的代码段、全局段、静态数据库的大小。

二、一切皆文件
1、UNIX、Linux环境中,文件操作具有特殊意义,因为操作系统把它的服务和设备,统一封装成了一种简单的接口(文件读写),在UNIX、Linux系统中一切皆是文件。
2、这样的好处就是程序可以像操作文件一样来操作磁盘、打印机、网络等设备。
3、大多数情况下只要使用(open/close/read/write/ioctl),就可以实现对设备的输入、输出、设置等操作。
4、UNIX、Linux中常见文件类型:
-普通文件
d目录文件
c字符设备文件
b块设备文件
l链接文件

三、文件操作相关的系统调用
open 打开/创建文件
close 关闭文件
read 读文件
write 写文件
lseek 设置读写位置
fcntl 修改文件属性
unlink 删除硬链接
creat 创建文件
rmdir 删除空目录
remove 删除硬链接/空目录

四、文件描述符
1、是一个非负整数,表示一个打开的文件。
2、由open函数返回,被内核空间引用(只能传递系统调用才有用)。
3、内核默认打开了三个文件
0 STDIN_FILENO stdin 标准输入
1 STDOUT_FILENO stdout 标准输出
2 STDERR_FILENO stderr 标准错误
4、文件描述符介于0~OPEN_MAX之间,超出这个范围就表示出错了。

五、open/creat/close
int open(const char *pathname, int flags);
功能:打开文件
pathname:文件的路径
flags:打开的方式
O_RDONLY 只读
O_WRONLY 只写
O_RDWR 读写
O_CREAT 当文件不存在时创建
O_EXCL 当文件存在时则创建失败
O_TRUNC 当文件存在时清空
O_APPEND 打开文件时文件位置指针设置到末尾
返回值:文件描述符

int open(const char *pathname, int flags, mode_t mode);
功能:打开或创建文件
pathname:文件的路径
flags:文件打开的方式
mode:创建文件时的权限
	S_IRWXU  00700  user (file owner) has read,
                   write and execute permission
    S_IRUSR  00400 user has read permission
    S_IWUSR  00200 user has write permission
    S_IXUSR  00100 user has execute permission

    S_IRWXG  00070 group has  read,  write  and
                 execute permission        
    S_IRGRP  00040 group has read permission
    S_IWGRP  00020 group has write permission
    S_IXGRP  00010 group has execute permission

    S_IRWXO  00007  others have read, write and
                   execute permission
    S_IROTH  00004 others have read permission
	S_IWOTH  00002 others have write permission
    S_IXOTH  00001 others have execute  permis‐sion
    注意:只有第一次文件创建时权限设置才有效。
返回值:文件描述符 

int creat(const char *pathname, mode_t mode);
功能:创建文件
pathname:文件的路径
mode:文件的权限
返回值:文件描述符

int close(int fd);
功能:关闭文件
fd:要关闭的文件描述符
返回值:成功返回0,失败返回-1	

六、write/read
ssize_t write(int fd, const void *buf, size_t count);
功能:写入数据
fd:文件描述符
buf:要写入的数据
count:写入的字节数
返回值:成功写入的字节数

ssize_t read(int fd, void *buf, size_t count);
功能:读取数据
fd:文件描述符
buf:数据存储位置
count:要读取的字节数
返回值:成功读取到的字节数

七、标准I/O与系统I/O
使用标准I/O(fopen/fwrite/fclose)和系统I/O(open/write/close)分别向文件中写10万个整数,使用time命令检查它们的运算时间,比较一下哪个整数快,思考为什么?
结论:标准I/O会比系统I/O读写速度更快。
原因:标准I/O使用的缓冲机制,并不会立即把数据交给系统I/O然后写入文件中,而暂时存在在缓冲区中,当缓冲区满时,再把数据通过系统I/O一次性写入到文件中。
当进行系统调用时,需要从用户态切换到内核态,频繁的切换会浪费大量的时间。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值