本篇介绍一些Linux文件操作API 函数的使用.

1.基本概念

1.1 linux 下一切皆文件(网络设备除外)

(1) 普通文件

(2) 目录

(3) 硬件设备

- 控制台 /dev/console

- 标准输入输出设备 /dev/tty

(4) 软链接文件

(5) 硬链接文件

1.2 文件操作 API

文件操作 API主要分为Linux系统API和标C库API, 其区别分别体现在效率和移植行上.

(1) linux :open read write close lseek ...( 效率高)

(2) 标 C 库函数 :fopen fread fwrite fclose fseek ...( 移植性强)

2. Linux的文件基本操作 API介绍

2.1 创建文件

creat 函数 : 用于创建文件

creat (const char* pathname, mode_t mode)

等价于 open 函数使用 flags 参数为 O_CREAT O_WRONLY O_REUNC

2.2 打开文件

open 函数 :用于打开文件, 创建文件

int open(const char* pathname, int flags, mode_t mode)filename : 要打开文件的名称(包含路径)flags : 以下三个参数必须选其中一个- O_RONLY- O_WRONLY- O_RDWR其他参数O_APPEND : 追加写入O_CREAT : 如果打开文件不存在则创建O_EXCL : 检测要创建的文件是否存在, 一般情况下和 O_CREAT 联合使用, 如果要创建文件已存在, 则返回失败O_TRUNC:文件截短为 0 长度mode : 创建文件时的读写权限返回值:失败返回-1, 错误编码 errno, 成功返回文件描述符

2.3 关闭文件

close函数 : 用于关闭文件

int close(int fd)fd : 要关闭文件对应的文件描述符, 即 open 函数的返回值返回值 : 失败 erron, 成功 0

2.4 写文件

write函数 : 用于写文件

ssize_t write(int fd, const void* buf, size_t count)fd : 要操作的文件buf : 数据源count : 期望写入的字节个数返回值 : 成功 返回实际写入字节个数,返回 0 表示没有写入任何信息,失败返回errno

2.5 读文件

read函数 : 用于读文件

ssize_t read(int fd, void* buf, size_t count) fd : 要操作的文件buf : 从文件中读取数据的写入位置count : 期望读取的字节个数返回值 : 成功 返回实际读取字节个数, 返回 0 代表读到这个文件的末尾, 失败返回-1

3. Linux的文件相关操作 API介绍

3.1 文件偏移量

每个打开的文件都记录着当前读写位置, 打开文件时读写位置是0, 表示文件开头, 通常读

写多少个字节就会将读写位置往后移多少个字节, 这个读写位置称作文件偏移offset, 文件

表中的 offset 决定读写文件的具体位置, open 文件时如果没有O_APPEND, offset=0.

lseek 函数 : 用于改变文件表中 offset 的取值

off_t lseek(int fd, off_t offset, int whence)fd : 操作的文件offset : 偏移量whence : 偏移的起始位置, 有三个取值- SEEK_SET, 从文件头开始计算- SEEK_CUR, 从当前位置计算偏移- SEEK_END, 从文件末尾计算偏移返回值 : 成功, 移动到的目标位置与文件头的距离, 失败返回-1

(1) lseek 计算文件的长度

len=lseek(fd,0,SEEK_END);

(2) lseek 移动的目标可以超越文件的末尾

后续执行写入操作会在文件中形成空洞文件, 空洞文件不占磁盘, 但被算在文件大小内

3.2 文件描述符复制

打开现存文件或新建文件时, 内核会返回一个文件描述符, 每一个文件描述符会与一个打开文件相对应, 不同的文件描述符也会指向同一个文件

dup / dup2函数 : 用于复制文件描述符, 不会复制文件表, 出现多个文件描述符

int dup(int oldfd)oldfd : 要复制的文件描述符返回值 : 新的文件描述符, 操作系统选取未使用的最小文件描述符int dup2(int oldfd, int newfd)oldfd : 要复制的文件描述符newfd : 指定新的文件描述符, 如果 newfd 已经被使用, 系统会强行关闭对应的文件, 使得newfd 处于未使用状态

实际编程过程中, dup / dup2函数通常用于重定向标准输出和标准出错

3.3 文件竞争

fcntl函数 : 用于对已打开的文件描述符进行各种控制操作以改变已打开文件的的各种属性

fcntl函数可以实现很多功能, 但其主要功能是文件记录锁, 解决多个进程同时竞争一个文件的问题

int fcntl(inf fd, int cmd, ... /* arg */)fd : 文件描述符cmd : 需要执行的具体操作 - F_GETLK : 测试 lock 所表示的所是否可以加, 若可加 lock.l_type 设置成 F_UNLCK, 否则通过 lock 返回当前锁的信息 - F_SETLK : 设置所的类型 - F_SETLkW : 加锁等待, 加锁不成功则一直等待, 除非被信号打断 返回 -1 arg : 针对cmd的值, fcntl能够接受第三个参 arg

当fcntl用于管理文件记录锁的操作时,第三个参数指向一个stsuct flock *lock的结构体构体

struct flock {  short_l_type; /*锁的类型 F_RDLCK(读锁)F_WRLCK(写锁) F_UNLCK(解锁) short_l_whence; /*偏移量的起始位置:SEEK_SET,SEEK_CUR,SEEK_END*/  off_t_l_start; /*加锁的起始偏移*/  off_t_l_len; /*上锁字节*/  pid_t_l_pid; /*锁的属主进程ID */ }; 

(1) 锁机制是建议性锁, 而不是强制性锁

(2) 读锁 (共享锁), 写锁(独占锁)

(3) 锁机制并不是真正把文件锁起来, 加锁不成功, 程序逻辑不去执行相应的文件操作

3.4 文件属性获取

struct stat {  dev_t st_dev; /* 文件所在设备的标识 */  ino_t st_ino; /* 文件结点号 */  mode_t st_mode; /* 文件保护模式 */  nlink_t st_nlink; /* 硬连接数 */  uid_t st_uid; /* 文件用户标识 */  gid_t st_gid; /* 文件用户组标识 */  dev_t st_rdev; /* 文件所表示的特殊设备文件的设备标识 */  off_t st_size; /* 总大小,字节为单位 */  blksize_t st_blksize; /* 文件系统的块大小 */  blkcnt_t st_blocks; /* 分配给文件的块的数量,512字节为单元 */  time_t st_atime; /* 最后访问时间 */  time_t st_mtime; /* 最后修改时间 */  time_t st_ctime; /* 最后状态改变时间 */ }; 

(1) stat 函数 : 获取文件的详细信息

int stat(const char *path, struct stat *buf);path : 要获取属性相关信息的文件名称(包含路径), 不需要打开文件, 直接给文件路径buf : 文件属性结构体, 为传出参数

(2) fstat函数 :

int fstat(int fd, struct stat *buf)path : 文件描述符buf : 文件属性结构体, 为传出参数

(3) lstat函数 : 获取软链接文件本身的信息

int lstat(const char *path, struct stat *buf)path : 要获取属性相关信息的文件名称(包含路径), 不需要打开文件, 直接给文件路径buf : 文件属性结构体, 为传出参数

(4) stat / lstat / fstat之间的区别

- fstat 函数 : 系统调用的是一个 "文件描述符", 而另外两个则直接接收"文件路径

linux time函数_Linux基础知识(三)相关推荐

  1. c linux time微秒_Linux基础知识(Linux系统、Linux中的链表)

    Linux系统简介 Linux系统的结构及特点 Linux系统的结构图如下图所示: 从上图可以看出,Linux是一个典型的宏内核(一体化内核)结构.硬件系统上面时硬件抽象层,在硬件抽象层上面时内核服务 ...

  2. Linux系统编程——进程基础知识

    Linux系统编程--进程基础知识 1.程序和进程 程序,是指编译好的二进制文件,在磁盘上,不占用系统资源(cpu.内存.打开的文件.设备.锁-) 进程,是一个抽象的概念,与操作系统原理联系紧密.进程 ...

  3. Linux之(6)Kconfig基础知识

    Linux之(6)Kconfig基础知识 Author:onceday date:2022年8月25日 本文档收集整理于互联网,可参考以下文档: Kconfig Language linux kern ...

  4. (六)JS基础知识三(走进作用域和闭包)【三座大山之二,不会闭包,基本不会通过】

    JS基础知识三(作用域和闭包) 提问 作用域 自由变量 闭包 this 提问 this的不同应用场景,如何取值 手写bind函数 实际开发中闭包的应用场景,举例说明 创建10个a标签,点击的时候弹出对 ...

  5. CSS基础知识---三种选择器

    CSS基础知识---三种选择器 选择器 标签选择器 id选择器 class选择器 全部代码 选择器 标签选择器 id选择器 class选择器 标签选择器 选择器优先级:id>class>标 ...

  6. C语言基础知识(三)-程序设计结构、数组、字符串处理函数

    本文是C语言的基础知识,主要讲解三种程序设计结构.数组.字符串和字符数组.数组元素查询以及字符串处理函数. 程序结构设计 包括C语言在内的几乎任何编程语言都支持以下三种程序设计结构,它们分别是: 顺序 ...

  7. r语言工作路径linux,R语言实用基础知识_工作路径-注释-安装和卸载R包_2019-12-01...

    R语言的实用基础知识有很多,都是我在工作和学习中所整理的,有的是看书整理的,也有的是从网络上的各种博客.各种资源获取的,所以我采用日更的方式进行支持整理和更新,希望能够帮到屏幕前的你! 今天是我日更的 ...

  8. [Python学习] 专题一.函数的基础知识

            最近才开始学习Python语言,但就发现了它很多优势(如语言简洁.网络爬虫方面深有体会).我主要是通过<Python基础教程>和"51CTO学院 智普教育的pyt ...

  9. Linux应用程序开发 基础知识

     Linux应用程序开发 本文讲述了linux应用程序开发的基本内容.值得学习! Copyright © 2006 本文遵从GNU 的自由文档许可证(Free Documentation Lice ...

最新文章

  1. href 带参数 打开exe_js调用exe文件 兼容所有浏览器
  2. Cocos2d-x使用iOS游戏内付费IAP(C++篇)
  3. 以一致的体验交付和管理云原生多集群应用
  4. c语言sizeof测量字符组长度,C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别...
  5. mysql 查询最早 表,【MySQL】MySQL查询表的创建时间
  6. EVEREST Ultimate Edition 4.50 Build 1330 Final
  7. 重构(Refactoring)概要描述
  8. 在线手机号码VCF批量导入工具
  9. noip模拟赛 寻宝之后
  10. ubuntu编译运行xv6
  11. python入门经典电子书-推荐6本学习Python的免费电子书
  12. C#开启和关闭UAC功能
  13. boobooke播布客
  14. 最贵新股没破发,此前弃购7.8个亿,背靠华为的这家半导体公司这么香?
  15. 随笔小记--微博手动扩容来解决因新热搜“鹿晗关晓彤恋情”引起的down机
  16. [编程题]漂流船问题
  17. python画自定义颜色的坐标图
  18. ISAM、MyISAM、InnoDB、ACID详解
  19. VS coda C++、python运行与Dbug配置
  20. 文正机械电子工程专业课_详解 | 机械电子工程专业学习内容与就业前景

热门文章

  1. PyCharm中Scrapy的安装
  2. 线性条件随机场代码解读
  3. 数学物理方法pdf_中考状元笔记九科(语文+数学+物理+化学+英语+历史+地理+政治+生物)(高清PDF);...
  4. 审车按月还是日期_@老司机,你该审车了,秒懂的审车攻略,快快揣口袋吧
  5. java解压zip包_Java中文件的压缩与解压,每天进步一点点系列
  6. 吃鸡电脑配置清单_2020电脑配置游戏装机清单(覆盖主流游戏)
  7. 神经架构搜索(Neural Architecture Search,NAS)介绍
  8. 【C++】C++类的学习(五)——纯虚函数与抽象类
  9. 【Proxy SwitchyOmega】Chrome安装插件【提示程序包无效:“CRX_HEADER_INVALID“】【解决方法】
  10. vba校对统计不同工作薄(2)