文件IO其二

1.文件IO

  文件IO属于linux系统中关于文件操作的系统调用,对于文件的操作也是跟标准IO一样,打开文件  >  操作文件  >  关闭文件。

  文件IO和标准IO的比较:

  

  标准IO 文件IO
代表打开的文件 文件流指针(FILE*) 文件描述符(fd)
打开文件/关闭文件 fopen/fclose open/close
读写操作
fputc/fgetc

fputs/fgets

fwrite/fread

fprintf/fscanf

read/write
读写操作 fseek/rewind/ftell lseek/dup/dip2/fcntl/stat/unlink...

a.文件描述符

  文件描述符用来代表一个打开的文件,本质上是一个非负整数,文件描述符本身并不存储任何的文件信息,只是用来对应文件表。通过文件描述符就可以找到对应的文件的信息(struct file)。

  在linux中,一个程序打开的文件数量有限,默认1024个,文件描述符从大小到大分配,可以重复使用。文件描述符从0开始,其中0、1、2已经被系统占用(程序自动打开),分别代表标准输入、标准输出、错误输出,我们使用的文件描述符从3开始。

b.打开文件  open 

      参数:pathname  文件的路径

         flags    打开的标志(多个标志用 | 连接)

         mode    创建文件的权限(仅仅在创建文件的时候用,必须用),权限可以用三位8进制(0开头)表示,也可以使用宏

       打开成功会返回一个新的文件描述符,失败返回 -1。

O_EXCL 必须创建标志:和创建标志一起使用,表示要创建文件,如果文件已存在报错
O_TRUNC 截断标志:打开后清空文件内容
O_APPEND 追加标志:打开文件后读写位置在文件末尾
O_NOCTTY 表示如果打开的是终端文件,不将终端作为会话的控制终端
O_NONBLOCK 表示使用非阻塞方式
flags标志 功能
O_RONDLY 只读
O_WRONLY 只写
O_RDWR  读写(只读、只写、读写这三个必须选一个)
O_CREATE 创建标志

c.关闭文件  close

d.读写操作

  

      参数:  fd  文件描述符

           buf  读写的内存地址

           count  希望读写的大小

      函数执行成功后会返回读写的带下,失败返回 -1,读到末尾或者什么都没读写到就返回0。

e.非读写操作

   (1)调整文件读写的位置  lseek()函数

      参数:  fd  要操作的文件描述符

           offset  相对于基准的便宜

           whence  读写位置的基准

SEEK_SET 文件开头
SEEK_CUR 当前位置
SEEK_END 文件末尾

      函数执行成功后返回调整后的读写位置距离文件开头的距离,失败则返回 -1。

    (2)复制文件描述符  dup()/dup2()函数

      复制文件描述符不会复制产生新的文件表条目(复制产生的描述符还是指向原来的那一条文件表条目),和重新打开不同。dup()由系统选定新的描述符(选最小未使用)的值,dup2()由调用者指定新的描述的符的值,如果指定的值已经被使用,会先关闭再使用(有安全隐患)

      参数:  oldfd 旧的文件描述符,newfd 新的文件描述符

    (3)fcntl()函数

      fcntl函数有很多功能,具体使用哪个功能由参数cmd决定,有如下几个常用的功能:

      1)复制文件描述符  2)设置/获取文件描述符的标志  3)设置文件锁

    

      参数:  fd  要操作的文件描述符

           cmd  功能

cmd 功能
F_DUPFD 复制文件描述符:此时需要使用第三个参数,第三个参数代表新的描述符的值,和dup2的区别在于不会强制关闭已使用的描述符,而是寻找大于等于参数值的最小未使用的描述符
F_SETFL/F_GETFL 设置/获取文件描述符的标志:

设置时,只能设置O_APPEND标志,权限标志和创建标志设置无效

获取时,可以获取权限标志和O_APPEND,创建标志无法获取

F_SETLK/F_SETLKW/F_GETLK 文件锁操作:

当在多个程序(进程)同时读写一个文件,有可能造成数据混乱,文件锁就是用来解决这个问题

文件锁就是在有一个程序(进程)读写文件时,对其它程序(进程)的读写操作进行限制

如何实现:一个程序(进程)读,允许其它程序(进程)读,但不允许其它程序(进程)写 --- 读锁

一个程序(进程)写,既不允许其它程序(进程)读,也不允许其它程序(进程)写 --- 写锁

文件锁是一个读写锁,其中读锁是一个共享锁,写锁是一个互斥锁

实现机制:文件锁本质上是一个标识,锁定的不是读写操作本身,而是锁定加锁操作

    F_SETLK/F_SETLKW用于加锁和解锁,F_SETLK属于非阻塞方式(立即返回),F_SETLKW属于阻塞式(成功才返回)

F_GETLK用于测试锁(基本不用)

            arg  可选参数,当用作文件锁功能时,arg参数应该是一个结构体(struct flock)

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;     /* 只在F_GETLK使用,其他时候给-1 */
               ...
           };

            函数的返回值:

            

      

      文件锁通常用在多程序(进程)同时访问同一个文件的场合,防止数据混乱。除此之外文件锁也可以用于后台服务程序(守护进程)的互斥,保证后台服务程序只有一份,在后台服务程序启动时加锁,加锁成功继续运行,加锁失败就直接退出

    (4)获取文件信息  stat()函数

    

struct stat {
     dev_t     st_dev;         /* 文件所在硬件的设备号 */
     ino_t     st_ino;         /* Inode 值(唯一代表一个文件) */
     mode_t    st_mode;        /* 文件类型和文件权限 */
     nlink_t   st_nlink;       /* 硬链接数 */
     uid_t     st_uid;         /* 所有者用户ID*/
     gid_t     st_gid;         /* 所有者的组ID */
     dev_t     st_rdev;        /* 设备号 (仅仅设备文件) */
     off_t     st_size;        /* 文件大小*/
     blksize_t st_blksize;     /* 块的大小 */
     blkcnt_t  st_blocks;      /* 块的个数 */

     /* Since Linux 2.6, the kernel supports nanosecond
        precision for the following timestamp fields.
        For the details before Linux 2.6, see NOTES. */

      struct timespec st_atim;  /* 最后访问时间 */
      struct timespec st_mtim;  /* 最后修改时间*/
      struct timespec st_ctim;  /* 最后状态修改时间 */

      #define st_atime st_atim.tv_sec      /* Backward compatibility */
      #define st_mtime st_mtim.tv_sec
      #define st_ctime st_ctim.tv_sec
 };

      参数:pathname  文件的路径

         satbuf    传出的文件信息

      函数执行成功就会返回0,失败则返回 -1。

    PS:fstat函数用文件描述符代表一个文件,lstat与stat类似,唯一的区别是当文件是一个软连接文件的时候,stat获取的是软连接指向的文件信息,lstat获取的是软连接本身的信息。

     (5)测试文件权限和是否存在  access()函数

     

      参数:  pathname  文件路径

           mode  测试内容

             F_OK  文件是否存在

             R_OK  读权限

             W_OK  写权限

             X_OK  执行权限

       函数返回0表示这个文件存在/具有这个权限,-1表示没有或者出错。

     (6)修改权限屏蔽字  umask

        传入新的权限屏蔽字,返回旧的权限屏蔽字(用于处理完之后的恢复)

     (7)其他函数

        chmod()修改权限

        mkdir()创建目录

        rmdir()删除空目录

        unlink()删除文件

        remove()删除文件/空目录

        rename()更改文件名

        chdir()切换工作目录

        truncat()指定文件的大小

        getcwd()获取当前绝俗路径

      PS:在C语言中可以调用system函数来执行命令行命令

      

 PS:如果有错误麻烦指出来,大家互相学习 0-0   

原文地址:https://www.cnblogs.com/smallqizhang/p/12380293.html

时间: 2024-11-05 20:32:17

文件IO其二的相关文章

第七篇:两个经典的文件IO程序示例

前言 本文分析两个经典的C++文件IO程序,提炼出其中文件IO的基本套路,留待日后查阅. 程序功能 程序一打印用户指定的所有文本文件,程序二向用户指定的所有文本文件中写入数据. 程序一代码及其注释 1 #include <iostream> 2 #include <fstream> // 使用文件处理对象记着要包含这个头文件 3 #include <string> 4 #include <vector> 5 6 using namespace std; 7

MySQL系列:innodb引擎分析之文件IO

innodb作为数据库引擎,自然少不了对文件的操作,在innodb中所有需要持久化的信息都需要文件操作,例如:表文件.重做日志文件.事务日志文件.备份归档文件等.innodb对文件IO操作可以是煞费苦心,其主要包括两方面,一个是对异步io的实现,一个是对文件操作管理和io调度的实现.在MySQL-5.6版本的innodb还加入了DIRECT IO实现.做了这么多无非是优化io操作的性能.在innodb的文件IO部分中,主要实现集中在os_file.*和fil0fil.*两个系列的文件当中,其中o

Linux下用文件IO的方式操作GPIO(/sys/class/gpio)(转)

通过sysfs方式控制GPIO,先访问/sys/class/gpio目录,向export文件写入GPIO编号,使得该GPIO的操作接口从内核空间暴露到用户空间,GPIO的操作接口包括direction和value等,direction控制GPIO方向,而value可控制GPIO输出或获得GPIO输入.文件IO方式操作GPIO,使用到了4个函数open.close.read.write. 首先,看看系统中有没有"/sys/class/gpio"这个文件夹.如果没有请在编译内核的时候加入 

(二) 一起学 APUE 之 文件 IO

. . . . . 昨天我们讨论了标准 IO,今天主要说说系统 IO. 1.文件描述符 在 SYSIO 中贯穿了一个整形数,它就是文件描述符.对内核而言,所有打开的文件都是通过文件描述符引用的.它的作用与 STDIO 中的 FILE 结构体类似,但是它们的工作原理是完全不同的.它实际上是一个由内核保存的数组下标,所以不会是负数,下面我会用一张图来表示它的作用. 图1 SYSIO 文件描述符 图是在 Ubuntu 下好不容易找到了一个画图软件画的,质量不怎么样,小伙伴们先凑合着看吧. 我解释下图上

(一)一起学 APUE 之 文件 IO

. . . . . 最近在学习 APUE,所以顺便将每日所学记录下来,一方面为了巩固学习的知识,另一方面也为同样在学习APUE的童鞋们提供一份参考. 本系列博文均根据学习<UNIX环境高级编程>一书总结而来,如有错误请多多指教. APUE主要讨论了三部分内容:文件IO.并发.进程间通信. 文件IO: 标准IO:优点是可移植性高,缺点是性能比系统 IO 差,且功能没有系统 IO 丰富. 系统IO:因为是内核直接提供的系统调用函数,所以性能比标准 IO 高,但是可移植性比标准 IO 差. 并发:

0723------Linux基础----------文件 IO 之 dup、dup2 和 fcntl 函数

1. dup 函数 1.1 dup 函数用来复制一个文件描述符,复制后的文件描述符可以正常使用(见例1).dup函数返回当前文件描述符表中一个最小的可用的文件描述符(Linux下分配文件描述符的规则是:寻找最小可用),这个过程由系统来完成.dup函数成功执行后,两个文件描述符fd_1 和 fd_2 指向同一个文件表项,因它们共享偏移量(文件数据结构图见Unix环境高级编程),在内核中的数据结构表示为:1个进程表项,1个文件表项(这里两个文件描述符指向同一个文件表项),1个V结点.文件表项中有一个

imx6用文件io操作gpio

具体请参考: http://blog.csdn.net/u014213012/article/details/53140781 这里要注意的是: 要让linux支持文件io方式操作gpio,首先驱动必须得支持,也就是说设备树上必须先配置好gpio模式,然后参照以上链接去实现gpio操作 这里举例来说:hud项目中(imx6dl平台),有一个蓝牙电源的使能受GPIO1_IO30的控制,所以我们必须得在设备树上配置这个pad为GPIO模式 1.配置gpio模式 现在需要在设备树上配置GPIO1_IO

TLPI(liunx/unix系统编程手册)笔记(三) 文件IO:通用的IO模型

读下来总的就是介绍了四个IO的API--open,read,write,close. 大家都是知道的,everything is file,在linux系统里面一切都是看作文件来操作的,学习linux就得先学好文件IO,也可以看见TLPI这本书的介绍完一些概念之后就开始介绍文件IO了. IO,大概的分为磁盘文件IO,buffering(缓冲)IO.貌似缓冲的水很深,之后会写博客. ------------------------------------ (1)文件描述符. 在进行IO操作之前,总

linux 文件IO

1.文件描述符 (1)文件描述符的本质是一个数字,这个数字本质上是进程表中文件描述符表的一个表项,进程通过文件描述符作为index去索引查表得到文件表指针,再间接访问得到这个文件对应的文件表.(2)文件描述符这个数字是open系统调用内部由操作系统自动分配的,操作系统分配这个fd时也不是随意分配,也是遵照一定的规律的,我们现在就要研究这个规律.(3)操作系统规定,fd从0开始依次增加.fd也是有最大限制的,在linux的早期版本中(0.11)fd最大是20,所以当时一个进程最多允许打开20个文件

标准IO与文件IO 的区别【转】

本文转载自:http://blog.sina.com.cn/s/blog_63f31f3401013jrn.html 先来了解下什么是标准IO以及文件IO. 标准IO:标准I/O是ANSI C建立的一个标准I/O模型,是一个标准函数包和stdio.h头文件中的定义,具有一定的可移植性.标准IO库处理很多细节.例如缓存分配,以优化长度执行IO等.标准的IO提供了三种类型的缓存. (1)全缓存:当填满标准IO缓存后才进行实际的IO操作.         (2)行缓存:当输入或输出中遇到新行符时,标准