zoukankan      html  css  js  c++  java
  • Linux文件操作学习总结【转载】

    本文转载自: http://blog.csdn.net/xiaoweibeibei/article/details/6556951

    文件类型:普通文件(文本文件,二进制文件)、目录文件、链接文件、设备文件、管道文件。   

       文件的权限:读、写、执行

      文件的相关信息:目录结构、索引节点、文件数据

    索引节点的stat结构

    struct stat{

    dev_t st_dev;//文件使用的设备号

    ino_t st_inl;//索引节点号

    mode_t st_mode;//文件访问权限

    nlink_t st_nlink;//文件的硬链接数

    uid_t st_uid;//所用者用户识别号

    gid_t st_gid;//组识别号

    dev_t st_rdev;//设备文件的设备号

    off_t st_size;//以字节为单位的文件容量

    unsigned long st_blksize;//包含该文件的磁盘块的大小

    unsigned long st_blocks;//文件所占的磁盘块

    time_t st_atime;//最后一次访问该文件的时间

    time_t st_mtime;//最后一次修改该文件的时间

    time_t st_ctime;//最后一次改变该文件状态的时间

    } ;

        在该结构体中,st_dev对应于每一个文件名,代表包含这个文件名和相应的索引节点的文件系统的设备号,st_rdev则只有字符设备和快设备具有,表示的是实际设备的设备号

    文件操作相关函数

    文件创建

    函数:int creat(const char *pathname,mode_t mode);

    头文件:sys/types.h     sys/stat.h   fcntl.h

    说明:

    mode取值如下:

    mode取值

    含义

    S_IRUSR

    文件所有者的读权限

    S_IWUSR

    文件安所有者的写权限

    S_IXUSR

    文件所有者的执行权限

    S_IRGRP

    文件所有者同组用户的读权限

    S_IWGRP

    文件所有者同组用户的写权限

    S_IXGRP

    文件所有者同组用户的执行权限

    S_IROTH

    其他用户的读权限

    S_IWOTH

    其他用户的写权限

    S_IXOTH

    其他用户的执行权限

    Linux系统中还定义了几个权限组合:

    S_IRWXU =(S_IRUSR|S_IWUSR|S_IXUSR)

    S_IRWXG =(S_IWGRP|S_IWGRP|S_IXGRP)

    S_IRWXO=(S_IROTH|S_IWOTH|S_IXOTH)

    当调用成功时,返回该文件的描述符,失败返回-1,此时文件以只读方式打开。

    文件打开

    函数:(1) int open( const char *pathname,int flags);

       (2)int open(const char *pathname,int flags,mode_t mode);

    头文件:sys/types.h     sys/stat.h   fcntl.h

    说明:flags用于描述文件打开参数,通过按位逻辑加得到,其中O_RDONLY,O_WRONLY和O_RDWR,3个值必需包含其中一种。flags取值如下:

    flags取值

    含义

    O_RDONLY

    以只读方式打开

    O_WRONLY

    以只写方式打开

    O_RDWR

    以读写方式打开

    O_CREAT

    若所打开文件不存在,则创建此文件

    O_EXCL

    若打开文件时设置了O_CREAT位且该文件存在,则导致失败

    O_NOCTTY

    若在打开tty时进程没有控制tty则不控制终端

    O_TRUNC

    若以只写或读写方式打开一个已存在文件时,将该文件截至0

    O_APPEND

    以追加的方式打开,将文件添加内容时将指针置于文件末尾

    O_NONBLOCK

    用于非阻塞接口I/O,若操作不能无延迟的完成,则在操作前返回

    O_NODELAY

    同O_NONBLACK

    O_SYNC

    只在数据被写入外存或其他设备之后才返回

        当调用成功时,返回要打开文件的描述符,调用失败返回-1,并置errno为相应错误号。

    文件关闭

    函数:int close(int fd);

    头文件:unistd.h

    说明:

        成功时返回0,失败时返回-1,并置errno为EBADF.当打开一个文件是,该文件描述中的引用计数加1,关闭一个文件时,该文件的引用计数减1,当引用计数为0时,close调用不仅释放该文件的描述符,还将释放该文件所占的描述表项。

    文件写操作

    函数:ssize_t write(int fd,void *buf,size_t count);

    头文件:unistd.h

    说明: 调用成功返回所写入段字节数,失败返回-1 ,并设置相应的errno。

     

    文件读操作

    函数:ssize_t read(int fd ,void *buf,size_t count);

    头文件:unistd.h

    说明:调用成功返回所读取的字节数,失败返回-1,并设置相应的errno。

    文件定位操作

    函数:off_t lseek(int fildes.off_t offset,int whence);

    头文件:unistd.h

    说明:调用成功返回相对于文件开头的实际偏移量,失败返回-1,并设置相应errno。whence取值如下:

    Whence取值

    含义

    SEEK_SET

    从文件开头计算偏移量;

    SEEK_CUR

    从当前位置计算偏移量;

    SEEK_END

    从文件的末尾计算偏移量

     

    文件属性修改

    函数:(1) int chown(const char *pathname,uid_t owner,gid_t group);

          (2) int fchown(int fd,uid_t owner,gid_t group);

    头文件:sys/types.h    unistd.h

    说明:改变文件的所有者,由于涉及权限问题,只有root用户可以调用chown和fchown来任意改变一个文件的所有者及所属的组,普通用户没有这个权限,普通用户只能修改自己所有的文件的组识别号,切只能在其所属的组中进行选择。

     

    函数:(1)int chmod(char *pathname,mode_t mode);

          (2)int fchmod(int fd,mode_t mode;

    头文件:sys/types.h    unistd.h

    说明: 改变文件的访问权限,关于权限的设置和chmod命令类似,调用成功返回0,失败返回-1,并设置errno。

    文件重命名

    函数:int rename( const char *oldname,const char *newname);

    头文件:stdio.h

    说明:当newname和oldname指向相同,则rename调用不做任何操作成功返回。

    oldname指向

    newname指向文件不存在

    newname指向普通文件

    newname指向目录文件

    oldname指向普通文件

    文件被重命名

    文件重命名

    错误返回

    oldname指向目录文件

    文件重命名

    错误

    newname所指向的目录文件为空目录则该目录被删除,oldname被重新命名,否则出错返回

    dupdup2调用

    函数:(1)int dup(int fd); (2) int dup2( int fd,int fd2);

    头文件:unistd.h

    说明:该调用都将复制文件描述符,两个调用成功执行时都将返回新得到的文件描述符,其区别在于(2)可以预先制定文件描述符fd2,如果fd2正在被使用,则先关闭fd2,如果fd2和fd相同,则不关闭该文件正常返回;

    statfstatlstat调用

    函数:(1) int stat(const char *pathname,struct stat *sbuf);

           (2) int fstat(int fd,struct stat *sbuf);

           (3) int lstat(const char *pathname,struct stat*buf);

    头文件:sys/types.h     sys/stat.h   unistd.h

    说明:对于lstat而言,当访问一个符号链接时,lstat只返回链接本身的信息,而stat和fstat将追踪到链接的末端文件,也就是所连接的文件。

     

    fsync调用

    函数:int fsync(int fd);

    头文件:unistd.h

    说明:将保存在缓冲区内的要写入文件描述符fd的所有数据刷新到要写入的文件中,当调用成功返回0,调用失败返回-1,并设置errno。

     

    flock调用

    函数:int flock(int fd,int operation);

    头文件:sys/types.h

    说明:将文件描述符所对应的文件加锁或解锁,operation用于表示不同的上锁或解锁方式,取值如下:

    LOCK_SH:共享锁    LOCK_EX:独占锁   LOCK_UN:解锁

        一个进程对一个文件只能有一个独占锁,但可以有多个共享锁,如果一个进程不试图去锁一个已经被上锁的文件,就不可以对其访问。当调用成功时返回0,失败时返回-1。

    fcntl调用

    函数:(1) int fcntl(int fd,int cmd);

           (2) int fcntl(int fd,int cmd,long arg);

    头文件:unistd.h   fcntl.h

    说明:参数arg为可选参数,对应于cmd的某些可取值,对应于执行某些特殊操作;调用成功时返回0,失败是返回-1,并设置errno,此外,fcntl调用能完成的大部分操作都可以用其他调用来完成。cmd的取值如下:

    cmd取值

    相应操作

    F_DUPFD

    复制文件描述符

    F_GETFD

    获取文件描述符

    F_SETFD

    设置close-on-exec标志

    F_GETFL

    获取open调用设置的标志

    F_SETFL

    设置open调用设置的标志

    F_GETLK

    获取离散的文件锁

    F_SETLK

    设置获得离散的文件锁,不等待

    F_SETLKW

    设置获得离散的文件锁,必要时等待

    F_GETOWN

    检索将收到SIGIO和SIGURG信号灯进程id或进程组号

    F_SETOWN

    设置进程id或进程组号

     

    特殊文件操作

    创建目录

    函数:int mkdir(const char *pathname,mde_t mode);

    头文件:sys/types.h   sys/stat.h

    说明:mode的值与表示其权限,mode的值由当前的umask的值得反值与设置的mode相与确定,该目录的所有者为调用mkdir创建它的进程的有效用户标识号。调用成功返回0,失败返回-1,并设置errno。

    删除目录

    函数:int rmdir(const char *pathname);

    头文件:unistd.h

    说明:当目录为空时,调用此函数可以将其删除,否则将删除失败。调用成功返回0,失败返回-1,并设置errno。

    打开目录

    函数:DIR * opendir(const char *pathname);

    头文件: sys/types.h    dirent.h

    说明:调用返回值为DIR类型,用于指向目录文件的结构指针。调用成功返回目录指针,调用失败返回NULL。

    关闭目录

    函数:int closedir( DIR *dp);

    头文件:sys/types.h    dirent.h

    说明:参数为要关闭的目录文件指针,该指针有opendir返回,调用成功返回0,失败返回-1,并设置errno。

    读取目录

    函数:struct dirent * readdir(DIP *dp);

    头文件:sys/types.h    dirent.h

    说明:用于访问目录指针dp的目录文件,其返回值为dirent结构体指针,dirent结构如下:

    struct drent{

    ino_t  d_ino;//目录节点号

    off_t d_off;//节点偏移量

    unsigned short d_reclen;//记录长度

    unsigned char d_type;//文件类型

    char d_name[256];//目录链接的文件名

    }

    当目录中没有更多链接时,返回0。

    创建硬链接

    函数:int  link(char *pathname1,char *pathname2);

    头文件:unistd.h

    说明:pathname1为已经存在的文件,pathname2为要建立的链接,pathname1和pathname2之西那个的路径必须在同一个文件系统中,只用超级用户才能创建一个指向目录文件的新的连接文件。调用成功返回0,失败返回-1。

     

    移除硬链接

    函数:int unlink(char *pathname);

    头文件:unistd.h

    说明:要移除一个文件的链接,必须要有对该目录的写权限和执行权限,当调用unlink时,目录的索引节点计数将减1,当链接计算器为0时,索引节点和文件数据块将被释放。

    创建符号链接

    函数:int symlink(const char *actualpath,const char *sympath);

    头文件:unistd.h

    说明:acturalpath为真实存在的文件,sympath为新创建的指向acturalpath的符号链接,调用成功返回0,失败返回-1,并设置errno。

    打开链接

    函数:int readlink(const char *pathname, char *buf,int bufsize);

    头文件:unistd.h

    说明:调用成功时,返回值为写入缓冲区的字节数,调用失败时,返回值为0,并设置errno。

  • 相关阅读:
    白色情人节为你身边的程序猿献上一份礼物!
    《大话操作系统——做坚实的project实践派》(3)
    hdu 1085 Holding Bin-Laden Captive!(母函数)
    LeetCode228:Summary Ranges
    android adb端口被占用解决方法
    TortoiseSVN比较工具设置为BeyondCompare 4
    Kotlin Android学习入门
    Android Studio中 ADB WIFI插件进行无线调试实践
    如何离线安装chrome插件
    Androoid studio 2.3 AAPT err(Facade for 596378712): \?C:Users中文文件夹.androiduild-cache
  • 原文地址:https://www.cnblogs.com/james6176/p/3919526.html
Copyright © 2011-2022 走看看