Linux下的文件操作总结

来源:互联网 发布:跑跑卡丁车淘宝依依 编辑:程序博客网 时间:2024/04/28 05:32

"In Linux, everything is a file."    ---  <<Beginning Linux Programming>>

3个主要的文件描述符:
    0: 标准输入
    1: 标准输出
    2: 标准错误

基本文件操作

write:
函数声明:ssize_t write(int fildes, const void *buf, size_t nbytes);
函数功能:把从buf开始的nbytes个字节写入描述符为fildes所关联的文件中。
返回值:   返回实际写入的字节数。返回值可能小于nbytes。如果返回0则
               没有数据写入;如果返回-1则表示有错误发生。

read:
函数声明:ssize_t read(int fildes, void *buf, size_t nbytes);
函数功能:把描述符为fildes所关联的文件中的nbytes个字节写入buf中。
返回值:   返回实际读入的字节数,可能小于nbytes。如果返回0则表示
               没有数据读入;如果返回-1则表示有错误发生。

open:
函数声明:int open(const char *path, int oflags);
               int open(const char *path, int oflags, mode_t mode);
函数功能:以oflags为存取模式,打开path所指向的文件,返回该文件的文件
               描述符。oflags可以是:(其他值请参考 man 2 open)
                     O_RDONLY   只读
                     O_WRONLY   只写
                     O_RDWR     读和写
                     O_APPEND   在文件的末尾添加
                     O_TRUNC    丢弃已经存在的内容,将文件长度置0
                     O_CREAT    创建文件,可以用mode参数指明权限
               这些值可以用“或”操作连接起来,如:O_CREAT|O_WRONLY|O_TRUNC。
               mode参数可以设置新建文件的访问权限:
                     S_IRUSR    读,文件所有者
                     S_IWUSR    写,文件所有者
                     S_IXUSR    执行,文件所有者
                     S_IRGRP    读,文件所有者所在的组
                     S_IWGRP    写,文件所有者所在的组
                     S_IXGRP    执行,文件所有者所在的组
                     S_IROTH    读,其他人
                     S_IWOTH    写,其他人
                     S_IXOTH    执行,其他人
               mode参数也可以用“或”连接,如open("myfile",O_CREAT,S_IRUSR|S_IXOTH),
               则文件myfile的权限为-r-------x。
返回值:   文件描述符(非负整数),如果失败则返回-1。

close:
函数声明:int close(int fildes);
函数功能:关闭文件描述符。
返回值:   0表示成功,-1表示失败。

ioctl:
函数声明:int ioctl(int fildes, int cmd, ...);
函数功能:向设备写入控制信息。
返回值:  -1表示出错。

例子:



lseek:
函数声明:off_t lseek(int fildes, off_t offset, int whence);
函数功能:对文件描述符fildes设置读写位置。offset设置读写位置,
               whence设置offset如何用。whence可以为如下值:
                      SEEK_SET   offset为绝对位置(文件开始的相对位置)
                      SEEK_CUR   offset为当前位置的相对位置
                      SEEK_END   offset为文件结尾的相对位置
返回值:   文件指针相对于文件开始的位置。

fstat, stat, and lstat:
函数声明:int fstat(int fildes, struct stat *buf);
               int stat(const char *path, struct stat *buf);
               int lstat(const char *path, struct stat *buf);
函数功能:fstat返回文件描述符fildes所关联文件的信息;stat、lstat
          返回已命名文件的信息;如果是符号链接,lstat返回符号
          链接本身的信息,而stat则返回符号链接所引用文件的信息。
          所返回的文件信息存储在结构体指针buf所指向的空间中。
          关于结构体stat的信息请参阅man 2 stat。
返回值:  如果成功则返回0,否则返回-1。

dup and dup2:
函数声明:int dup(int fildes);
               int dup2(int fildes, int fildes2);
函数功能:返回不同的文件描述符访问同一个文件。dup返回fildes
               所关联文件的一个新文件描述符;dup2创建fildes的一个
               副本。它们通常用于读写同一个文件的不同位置,也用于
               多个进程通过管道进行通信。
返回值:   如果出错则返回-1。



标准I/O库
参见C语言教程。



文件流和文件描述符


每一个文件流都和底层的一个文件描述符相关联,你能混合使用它们。
int fileno(FILE *stream);
FILE *fdopen(int fildes, const char *mode);
    fileno返回文件文件流stream的文件描述符,如果出错则返回-1;
    fdopen为文件描述符fildes创建文件流。fildes必须为已打开的。
    fdopen和fopen除了第一个参数不一样,其他都一样。



文件和目录的维护

改变权限:int chmod(const char *path, mode_t mode);
改变所有者:int chown(const char *path, uid_t owner, gid_t group);

unlink, link, and symlink:
函数声明:int unlink(const char *path);
               int link(const char *path1, const char *path2);
               int symlink(const char *path1, const char *path2);
函数功能:unlink删除目录下的文件,如果是硬链接则还将链接数减1.
               link创建path2,path2为path1的硬链接。
               symlink创建path2,path2为path1的软链接。
返回值:   成功返回0,失败返回-1。

mkdir and rmdir:
函数声明:int mkdir(const char *path, mode_t mode);
               int rmdir(const char *path);
函数功能:mkdir创建权限为mode的目录。
               rmdir删除目录,只有当path为空目录时才能删除。
返回值:   成功返回0,失败返回-1。

chdir and getcwd:
函数声明:int chdir(const char *path);
               char *getcwd(char *buf, size_t size);
函数功能:chdir改变程序运行的的当前目录。
               把程序运行的当前目录写入buf,目录名的长度不能超过size。
返回值:   成功返回0,失败返回-1。



扫描目录

用DIR结构对目录操作,DIR*称为目录流(如同FILE*称为文件流一样)

opendir
函数声明:DIR *opendir(const char *name);
函数功能:opendir打开一个目录。
返回值:   成功则返回一个DIR结构的指针,失败返回NULL。

readir
函数声明:struct dirent *readdir(DIR *dirp);
函数功能:在dirp中返回下一个目录入口。
返回值:   目录入口信息(man dirent)。如果出错或到达目录结尾,
               则返回NULL。

telldir
函数声明:long telldir(DIR *dirp);
函数功能:返回目录流dirp中的当前位置。
返回值:  

seekdir
函数声明:void seekdir(DIR *dirp, long loc);
函数功能:设置dirp中的目录入口指针,loc表示指针的位置。
返回值:   无

closedir
函数声明:int closedir(DIR *dirp);
函数功能:关闭目录流。
返回值:   成功返回0,失败返回-1。


例子:


高级话题

内存映射函数(mmap)设置一段内存空间,这段空间可以被多个程序读写。
mmap也可以用来操作文件,它可以使文件的整个内容看起来像内存中的数组一样。

函数声明:void *mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off);
函数功能:(man mmap)fildes为文件描述符;off指定映射的文件的起始位置;len指定要
               映射的长度(也就是内存段的长度);prot指定这段内存的
               存取权限,prot可为以下值(可以用or连接):
                     PROT_READ   可读
                     PROT_WRITE  可写
                     PROT_EXEC   可执行
                     PROT_NONE   该内存段不能存取
               flags设置这段内存的控制信息,MAP_PRIVATE为私有的,MAP_SHARED为共享的。
               MAP_SHARED可以使对这段内存的修改反映到文件中。addr指定这段内存空间的
               起始地址,如果为0则由系统自动分配(推荐)。
返回值:   如果成功则返回这段内存空间的其实地址,失败返回MAP_FAILED。