• Linux C 文件与目录2 文件的打开与关闭


    文件的打开与关闭 open和close

      文件的打开指的是从磁盘中找到一个文件,返回一个整形的打开文件顺序的编号。打开的文件处于可读、可写状态。文件的关闭指的是释放打开的文件,是文件处于不可读写的状态。


     

      打开文件函数open:

    参数解析

      函数open的作用是打开一个文件,是文件处于可读写的状态,这个函数的使用方法如下:

      int open(char *pathname , int flags);

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

    这个函数包含头文件:

      #include<sys/types.h>

      #include<sys/stat.h>

      #include<fcntl.h>

      第一个参数:pathname 表示打开文件的路径字符串。

      第二个参数:参数flags是系统定义的一些整形常数,表示文件的打开方式。Flags的值如下:

      O_RDONLY:以只读方式打开文件。

      O_WRONLY:以只写方式打开文件。

      O_RDWR:以读写方式打开文件。

      上面三种旗标是互斥的,不可以同时使用,但可以与下面旗标利用“|”运算符组合。第三个参数仅当

      O_CREAT:若要打开的文件不存在则自动创建文件。

      O_EXCL:如果EXCL被设置,此指令回去检查文件是否存在。文件若不存在则建立该文件。此外,若O_CREAT与O_EXCL同时设置时,如果要创建的文件已存在,则返回-1,并且修改errno的值。

      O_NOCTTY:如果要打开的文件为终端机的设备时,则不会将该终端机当成进程控制终端机。

      O_TRUNC:若文件存在并且以可写的方式打开时,此标志会清空文件。这样原来的文件内容会丢失。

      O_APPEND:以附加的文件打开文件。当读写文件时会从文件尾开始向后移动,写入的数据会以附加的方式写入到文件的后面。

      O_NONBLOCK:以不可阻断的方式打开文件,无论文件有无数的数据读取或等待操作,都会立即打开文件。

      O_NDELAY:O_NONBLOCK。

      O_SYNC:已同步的方式打开文件,所有的文件操作不写入到缓存。

      O_NOFOLLOW:如果参数pathname所指的文件为一符号链接,则会打开失败。

      O_NOCTTY:如果参数pathname所指的文件的目录不存在,则打开文件失败。

       第三个参数:仅当创建新文件时(即 使用了O_CREAT 时)才使用,用于指定文件的访问权限位。打开文件时,如果没有这个文件则会自动新建一个文件。在新建文件时需要设置新建文件权限。系统为参数mode定义了下面这些常数,可以直接使用这些常数来设置文件的权限。这些权限设置只有在新建文件时才会有效。

    mode 参数:

     
     
     
     
     
     
     
     
     
     
     
     
    文件所有者的权限:
    S_IRWXU,00700权限,代表该文件所有者具有可读、可写及可执行的权限。
    S_IRUSR或S_IREAD,00400权限,代表该文件所有者具有可读取的权限。
    S_IWUSR或S_IWRITE,00200权限,代表该文件所有者具有可写入的权限。
    S_IXUSR或S_IEXEC,00100权限,代表该文件所有者具有可执行的权限。
     
    文件所有者同组者的权限:
    S_IRWXG,00070权限,代表该文件用户组具有可读、可写及可执行的权限。
    S_IRGRP,00040权限,代表该文件用户组具有可读的权限。
    S_IWGRP,00020权限,代表该文件用户组具有可写入的权限。
    S_IXGRP,00010权限,代表该文件用户组具有可执行的权限。
     
    其他用户的权限:
    S_IRWXO,00007权限,代表其他用户具有可读、可写及可执行的权限。
    S_IROTH,00004权限,代表其他用户具有可读的权限
    S_IWOTH,00002权限,代表其他用户具有可写入的权限。
    S_IXOTH,00001权限,代表其他用户具有可执行的权限。

     

      例子:用open函数打开一个文件。调用这个函数时,如果正确地打开这个文件则返回这个文件的打开编号,如果打开失败则返回-1。

    open函数可能发生下面的错误,可用errno捕获打开文件时发生的错误。

    EEXIST:参数pathname所指的文件已经存在,却使用了O_CREAT和O_EXCL旗标。

    EACCESS:参数pathname所指的文件没有打开权限。

    EROFS:与写入权限的文件存在于只读文件系统内。

    EFAULT:参数pathname指针超出可存取内存空间。

    EINVAL:参数mode不正确。

    ENAMETOOLONG:参数pathname太长。

    ENOTDIR:参数pathname不在一个目录中。

    ENOMEM:核心内存不足。

    ELOOP:参数pathname有过多符号链接问题。

    EIO:I/O存储错误。


     

    #include<stdio.h>
    #include<unistd.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<fcntl.h>
    #include<errno.h>
    int main(void)
    {
    int fd ,fd1;
    char path[]="/root/txt1.txt";
    extern int errno;
    fd = open(path, O_WRONLY, 0766);                           //以只写方式打开文件,不能自动建立。
    if(fd != -1)
    {
    printf("opened file %s. ", path);
    }
    else
    {
    printf("can't open file %s. " , path);
    printf("errno:%d ", errno);
    }
    fd1 = open(path , O_WRONLY|O_CREAT,0766);    //以只写方式打开,不存在就新建,用户有可读、可写、可执行的权限,其他成员可读可执行。
    if(fd1 != -1)
    {
    printf("opened file %s. ", path);
    }
    else
    {
    printf("can't open file %s. ", path);
    printf("errno: %d " , errno);
    }
    return 0;
    }

    "open.c" 33L, 578C written
    [root@centos-64-min exercise]# gcc -o open open.c
    [root@centos-64-min exercise]# ./open
    can't open file /root/txt1.txt.
    errno:2
    opened file /root/txt1.txt.


    关闭文件函数close

      函数close的作用是关闭一个已经打开的文件。使用完文件后需要使用close函数关闭该文件,这个操作会让数据写回磁盘,并释放该文件所占用的资源。

    函数原型:int close(int fd);

    函数的头文件:#include<unistd.h>

      参数fd是open函数打开文件时返回的打开序号。如果文件成功关闭则返回0,发生错误返回-1。虽然进程结束时,系统会自动关闭已经打开的文件,但仍建议在程序中关闭文件,并检查返回值是否正确。

    常用检查方式:if(close(fd) == -1)

            {

              printf("close file error. ");

              printf("errno:%d " , errno);//显示错误号

              printf("ERR :%s " , strerror(errno));//显示错误信息

            }

    小例子:

    [root@centos-64-min exercise]# cat close.c
    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <errno.h>

    int main(void)
    {
    int fd;
    char path[]="/root/txt1.txt";
    extern int errno;
    fd = open(path , O_WRONLY|O_CREAT,0766);
    if(fd != -1)
    {
    printf("opened file %s. ", path);
    }
    else
    {
    printf("can't open file %s. ", path);
    printf("errno: %d " , errno);
    }

    if(close(fd) == -1)
    {
    printf("close file %s error. " , path);       //打印信息
    printf("errno: %s " , errno);                  //显示错误编号
    }
    else
    {
    printf("close file %s. " , path);
    }

    if(0 == close(1156))
    {
    printf("closed 1156. ");
    }
    else
    {
    printf("close 1156 error. ");
    printf("errno: %d " , errno);
    }
    return 0;
    }
    [root@centos-64-min exercise]# ./close
    opened file /root/txt1.txt.
    close file /root/txt1.txt.
    close 1156 error.
    errno: 9

  • 相关阅读:
    我不喜欢的 Rust 特性 (之一) eager drop
    为 Windows Phone 8.1 app 解决“The type does not support direct content.”的问题
    输入10个互不相同的数字并分成5对,问有多少种分法。
    code wars quiz: toInteger
    my first emacs custom key binding
    http协议消息报头学习笔记
    移动端经常遇到的小bug
    js小技巧
    ajax
    js正则表达
  • 原文地址:https://www.cnblogs.com/King-Penguin/p/5249272.html
Copyright © 2020-2023  润新知