文件的打开与关闭 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.\n", path);
}
else
{
printf("can't open file %s.\n" , path);
printf("errno:%d\n", errno);
}
fd1 = open(path , O_WRONLY|O_CREAT,0766);    //以只写方式打开,不存在就新建,用户有可读、可写、可执行的权限,其他成员可读可执行。
if(fd1 != -1)
{
printf("opened file %s.\n", path);
}
else
{
printf("can't open file %s.\n", path);
printf("errno: %d\n" , 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.\n");

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

          printf("ERR :%s\n" , 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.\n", path);
}
else
{
printf("can't open file %s.\n", path);
printf("errno: %d\n" , errno);
}

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

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

Linux C 文件与目录2 文件的打开与关闭的更多相关文章

  1. linux重要的标准目录和文件

    linux重要的标准目录和文件 / 根目录,所有其他文件在根文件系统的子目录下 /bin 基本命令的二进制文件,存放linux下常用的命令和工具 /boot 引导加载器的固有文件,linux就是从这里 ...

  2. Linux目录和文件——查询目录和文件的命令

    Linux目录和文件——查询目录和文件的命令 摘要:本文主要学习了在Linux系统中是如何查询目录和文件的. which命令 which命令是根据PATH环境变量设置的路径,去搜索执行文件. 基本语法 ...

  3. Linux目录和文件——管理目录和文件的命令

    Linux目录和文件——管理目录和文件的命令 摘要:本文主要学习了Linux系统中关于目录和文件的操作. cd命令 cd命令用来切换工作目录,是Change Directory的缩写. 基本语法 cd ...

  4. 第十九章 Python os模块,pathlib 判断文件是目录还是文件

    OS模块 os.path.abspath() :返回path规范化的绝对路径 import sys import os BASE_DIR = os.path.dirname(os.path.dirna ...

  5. [转]C# FileSystemWatcher监控指定文件或目录的文件的创建、删除、改动、重命名等活动

    觉得这个很常用..比如一些软件.   http://www.rabbit8.cn/DoNet/407.html   FileSystemWatcher控件主要功能: 监控指定文件或目录的文件的创建.删 ...

  6. 【转载】C#递归删除文件夹目录及文件

    在C#文件操作过程中,有时候需要删除相应目录,如果文件夹中含有其他文件夹或者文件,也需要一并进行删除,此时可能就需要使用递归来删除文件夹目录以及文件,递归过程中,如果遍历的对象是文件夹,则删除文件夹, ...

  7. linux常用命令之--目录与文件的操作命令

    1.linux的目录与文件的增.删.改.复制 pwd:用于显示当前所在的目录 ls:用于显示指定目录下的内容 其命令格式如下: ls [-option] [file] 常用参数: -l:显示文件和目录 ...

  8. 【转】linux中的常见目录及文件

    1. /proc目录 Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构.改变内核设置的机制.proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以 ...

  9. Window Linux下实现指定目录内文件变更的监控方法

    转自:http://qbaok.blog.163.com/blog/static/10129265201112302014782/ 对于监控指定目录内文件变更,window 系统提供了两个未公开API ...

  10. Linux中 /proc/[pid] 目录各文件简析

    Linux 内核提供了一种通过 proc 文件系统,在运行时访问内核内部数据结构.改变内核设置的机制.proc 文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文件系统的方式为访问系 ...

随机推荐

  1. MSSQL Server Transaction 数据库事务回滚的用法

    使用的表结构如下:         Commit TransAction    Else        Rollback TransAction/*    自定义一个变量来判断最后是否发生过错误.*/ ...

  2. gulp sass使用

    var gulp = require("gulp");var sass = require("gulp-sass-china");var dgbl = requ ...

  3. Facebook React完全解析

    2004年,对于前端社区来说,是里程碑式的一年.Gmail横空出世,它带来基于前端渲染的原生应用级别的体验,相对于之前的服务端渲染网页可谓提升了一个时代,触动了用户的G点.自此,前端渲染的网站成为无数 ...

  4. Android IOS WebRTC 音视频开发总结(二九)-- 安卓噪声消除交流

    Android上的音质一直被大家所困扰和诟病,这里面有很多原因, 下面是最近一位前UC同行发邮件跟我交流的一些记录,供参考,支持原创,文章来自博客园RTC.Blacker,转载请说明出处. 以下文字来 ...

  5. 替换 PDF 文字

    1.从http://pan.baidu.com/s/1pJlVBqN下载Foxit Phantom.exe: 2.安装这个软件: ① 弹出这个对话框时选择“运行”: ② 授权协议选择“同意”: ③ 选 ...

  6. JS日期(Date)处理函数总结

    获取日期 1.Date() ——返回当日的日期和时间. 2.getDate() ——从 Date 对象返回一个月中的某一天 (1 ~ 31). 3.getDay() ——从 Date 对象返回一周中的 ...

  7. 调试工具-fiddler

    本地资源替换线上调试 Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网 之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据(指cookie,html ...

  8. j-query j-query

    jQuery   1.安装:http://jquery.com/download/登陆这个jQuery下载2在.html文件的<head>标签中导入3 语法$(selector).acti ...

  9. SQL语句统计一段时间内的记录数

    实际应用中经常需要统计单位时间的记录数: 一个小时: SELECT ),createdate,) AS 日期 ,DATEPART(hh,createdate) AS 小时,COUNT(*)AS 记录 ...

  10. web.xml中的url-pattern映射规则

    Servlet和filter是J2EE开发中常用的技术,使用方便,配置简单.servlet和filter中的url-pattern有一些文章在里面的,总结了一些东西,以免遇到问题又要浪费时间. 一,s ...