• Linux 文件API


      9/19/2017  开始攻读《LinuxC编程实战》,这是相关的笔记


    1.创建

    int creat(const char *filename, mode_t mode);

      参数mode指定新建文件的存取权限,它与umask一起决定文件最终的存取权限(mode&umask),其中umask代表的是创建文件时需要去掉的文件存取权限,可通过系统调用下列函数改变umask的值:

    int umask(int newmask);

      改调用通过将umask设置为newmask,然后返回旧的umask的值,它只影响r、w、x的权限。

    2.打开

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

      open有两种形式,其中pathname是我们要打开的文件名,包括路径,否则缺省在当前目录下。flags为下面任意一个值或者是多个值的组合:

      

      其中O_RDONLY、O_WRONLY、O_RDWR只能选一个用。

      如果选用O_CREAT,则应选用open的第二种形式,即带参数mode,表示文件的访问权限,mode的值从下图中选:

      

      

      除上述利用宏来产生标志之外,我们还可以利用数字表示法:

        用五位数字表示文件的权限:

        • 第一位,设置用户ID
        • 第二位,设置组ID
        • 第三位,设置用户权限
        • 第四位,设置组权限
        • 第五位,设置其他人的权限

      每位的取值可为1(执行权限)、2(写权限)、4(读权限)、0(无权限),或是它们的和。

      设置ID与不设置ID用1、0表示。

      举例:要创建一个用户可读、可写、可执行,但是组没有权限,其他人可以读、可以执行的文件,并设置用户 ID 位

         ——对应的数值为10705

    open("test" , O_CREAT , 10705);  
    //或 open("text" , O_CREAT , S_IRWXU | S_IROTH | S_IXOTH | S_ISUID);

      如果操作成功,则返回一个文件描述符,以后对文件的操作都通过该文件描述符表示

      以O_CREAT为标识符的open实际上实现了creat(); ,下列代码等同于creat();
    open( pathname, O_CREAT | O_RDWR, mode);

    3.读写

    int read(int fd , const void *buf , size_t length);
    int write(int fd , const void *buf , size_t length);

      参数buf是缓冲区指针,length是缓冲区大小(单位是字节)。read函数实现从文件描述符fd读取length个字节输入到缓冲区中。write函数实现的是向文件描述符fd里写入length个字节的缓冲区数据。

      read():返回值是实际读取字节的个数。同理,write():是实际写入字节的个数。

     

    4.定位

    int lseek(int fd , offset_t offset , int whence);  

      lseek();将文件的读写指针相对whence位置移动offset个字节,操作成功时,返回文件指针相对于文件头的位置。  

      参数 whence 可使用下述值:

      • SEEK_SET:相对文件开头
      • SEEK_CUR:相对文件读写指针的当前位置
      • SEEK_END:相对文件末尾

      offset 可取负值,例如下述调用可将文件指针相对当前位置向前移动 5 个字节:

    lseek(fd , -5 ,SEEK_CUR);
    

      由于 lseek 函数的返回值为文件指针相对于文件头的位置,因此下列调用的返回值就是文件的长度:

    lseek( fd , 0 , SEEK_END);
    

      

    5.关闭

    int close(int fd);
    

      关闭文件,即关闭文件描述符。

      

    例程:

      编写一个程序,在当前目录下创建用户可读写文件“hello.txt”,在其中写入“Hello, software weekly”,关闭该文件。再次打开该文件,读取其中的内容并输出在屏幕上。

    #include <sys/types.h>  
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <string.h>

    int main() {
    int fd, len; char str[LENGTH]; /* 创建并打开文件 */ fd = open("hello.txt", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
       //这样写更简洁 fd = open("hello.txt" , O_CREAT | O_RDWR , 10705);
    if (fd) { /* 写入 Hello, software weekly 字符串 */ write(fd, "Hello, Software Weekly", strlen("Hello, software weekly")); close(fd); } fd = open("hello.txt", O_RDWR); len = read(fd, str, LENGTH); /* 读取文件内容 */ str[len] = ''; printf("%s ", str); close(fd);
       return 0; }

      

    头文件简介:  

    1. #include <sys/types.h>:是Unix/Linux系统的基本系统数据类型的头文件,含有size_t,time_t,pid_t等类型。
    2.  #include <sys/stat.h>:其中的函数可轻松获取文件属性,stat函数可以返回一个结构,里面包括文件的全部属性。
    3. #include <fcntl.h>:fcntl.h头文件定义了文件操作等所用到的相关宏。如O_creat、O_RDONLY、O_RDWR...

    如何查陌生的库函数来源于哪个头文件?

      如果不懂函数来源于哪个头文件,可使用man命令。

      man命令的用法:1. man 2 <系统调用>  2.man 3 <库函数>

    ————全心全意投入,拒绝画地为牢
  • 相关阅读:
    Apache Struts 2.3.12 GA?
    emacs配置《转》
    vim配置
    vim插件
    git使用
    ubuntu常用设置
    Eclipse如何关联已经clone的Git项目
    变量名、对象引用(指针)与堆栈
    Web项目转换为groovy项目的步骤
    日志 20071208(SvcUtil.exe,高并发网站架构)
  • 原文地址:https://www.cnblogs.com/Bw98blogs/p/7554948.html
Copyright © 2020-2023  润新知