00. 目录

文章目录

  • 00. 目录
  • 01. 文件描述符
  • 02. 常用文件IO函数
    • 2.1 open函数
    • 2.2 close函数
    • 2.3 read函数
    • 2.4 write函数
  • 03. 案例实战
  • 04. 附录

01. 文件描述符

在 Linux 的世界里,一切设备皆文件。我们可以使用系统调用中 I/O 的函数(I:input,输入;O:output,输出),对文件进行相应的操作( open()、close()、write() 、read() 等)。

打开现存文件或新建文件时,系统(内核)会返回一个文件描述符,文件描述符用来指定已打开的文件。这个文件描述符相当于这个已打开文件的标号,文件描述符是非负整数,是文件的标识,操作这个文件描述符相当于操作这个描述符所指定的文件。

程序运行起来后(每个进程)都有一张文件描述符的表,标准输入、标准输出、标准错误输出设备文件被打开,对应的文件描述符 0、1、2 记录在表中。程序运行起来后这三个文件描述符是默认打开的。

#define STDIN_FILENO  0 //标准输入的文件描述符#define STDOUT_FILENO 1 //标准输出的文件描述符#define STDERR_FILENO 2 //标准错误的文件描述符

在程序运行起来后打开其他文件时,系统会返回文件描述符表中最小可用的文件描述符,并将此文件描述符记录在表中。Linux 中一个进程最多只能打开 NR_OPEN_DEFAULT (即1024)个文件,故当文件不再使用时应及时调用 close() 函数关闭文件。

02. 常用文件IO函数

2.1 open函数

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);int creat(const char *pathname, mode_t mode);
功能:打开文件,如果文件不存在则可以选择创建。
参数:pathname:文件的路径及文件名flags:打开文件的行为标志,必选项 O_RDONLY, O_WRONLY, O_RDWRmode:这个参数,只有在文件不存在时有效,指新建文件时指定文件的权限
返回值:成功:成功返回打开的文件描述符失败:-1

flags取值:


mode: 这个参数,只有在文件不存在时有效,指新建文件时指定文件的权限

2.2 close函数

#include <unistd.h>int close(int fd);
功能:关闭已打开的文件
参数:fd : 文件描述符,open()的返回值
返回值:成功:0失败: -1, 并设置errno

需要说明的是,当一个进程终止时,内核对该进程所有尚未关闭的文件描述符调用close关闭,所以即使用户程序不调用close,在终止时内核也会自动关闭它打开的所有文件。

但是对于一个长年累月运行的程序(比如网络服务器),打开的文件描述符一定要记得关闭,否则随着打开的文件越来越多,会占用大量文件描述符和系统资源。

2.3 read函数

#include <unistd.h>ssize_t read(int fd, void *buf, size_t count);
功能:把指定数目的数据读到内存(缓冲区)
参数:fd : 文件描述符buf : 内存首地址count : 读取的字节个数
返回值:成功:实际读取到的字节个数失败: - 1

2.4 write函数

#include <unistd.h>ssize_t write(int fd, const void *buf, size_t count);
功能:把指定数目的数据写到文件(fd)
参数:fd : 文件描述符buf : 数据首地址
count : 写入数据的长度(字节)
返回值:成功:实际写入数据的字节个数失败: - 1

03. 案例实战

实现文件拷贝功能的程序。

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>#define SIZE 128int main(int argc, char **argv)
{int fin = -1;int fout = -1;long ret = -1;char buf[SIZE];if (3 != argc){printf("usage: ./a.out filename1 filename2\n"); goto err0;}//以只读的方式打开一个文件fin = open(argv[1], O_RDONLY);if (-1 == fin){perror("open"); goto err0;}//打开文件fout = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644);if (-1 == fout){perror("open"); goto err1;}while(1){memset(buf, 0, SIZE);ret = read(fin, buf, SIZE); if (ret <= 0)break;ret = write(fout, buf, ret);if (ret <= 0)break;}//关闭文件close(fin);close(fout);return 0;
err2:close(fout);
err1:close(fin);
err0:return -1;
}

编译和测试

04. 附录

4.1 测试代码下载:

【Linux系统编程】Linux文件操作相关推荐

  1. Linux系统编程 | 01 -文件操作

    一.文件操作方法 linux中有两种方法可以操作文件:系统调用和c库函数. 1. 什么是系统调用? 由操作系统实现并提供给外部应用程序的编程接口(API),是应用程序同系统之间数据交互的桥梁. C标准 ...

  2. 【Linux系统编程】文件描述符的复制dup()和dup2()

    00. 目录 文章目录 00. 目录 01. 文件描述符复制概述 02. 常用函数 2.1 dup函数 2.2 dup2函数 03. 案例实战 3.1 dup示例 3.2 dup2示例 04. 附录 ...

  3. Linux系统编程之文件IO

    Linux系统编程之文件IO 文件IO第一天 一.标准IO基本概念 1.1c语言函数 (c库函数) 调用实现某一个功能,(API) 1.2系统调用:内核中的程序接口,应用程序和硬件设备之间的中间层 1 ...

  4. linux系统编程之文件与I/O(六):fcntl 函数与文件锁

    2013-05-14 11:26 8290人阅读 评论(2) 收藏 举报  分类: linux系统编程(19)  版权声明:本文为博主原创文章,未经博主允许不得转载. 一.fcntl函数 功能:操纵文 ...

  5. linux系统io编程,Linux系统编程(1) —— 文件IO

    本文主要对Linux系统中文件I/O的基本操作进行说明. 在Linux系统编程中,对文件进行处理的流程,通常是: 打开文件 读写文件 关闭文件 Linux内核对每一个进程维护一个打开的文件列表, 该文 ...

  6. 【Linux | 系统编程】Linux系统编程(文件、进程线程、进程间通信)

    文章目录 Linux系统编程 文件IO open/close函数 read/write函数 文件描述符 阻塞.非阻塞 fcntl函数 lseek函数 传入传出参数 文件系统 文件存储 文件操作 sta ...

  7. Linux系统编程【文件IO、进程、进程间通信、信号、线程、互斥】

    linux系统编程 个人通过学习,手打了一份48000字的Linux系统编程的笔记,包含了[文件IO.进程.进程间通信.信号.多线程.互斥]等知识点,并给出了大量的代码案例对每个重要的知识点进行了代码 ...

  8. Linux系统编程.NO7——目录操作函数

    5. 目录文件管理函数 5.1. 目录文件概念 目录在Linux中也是文件,也有对应的文件指针,每次读目录之前也要先打开目录,然后目录指针就出现了,第一次读就是第一个文件的信息,然后第二次读就是第二个 ...

  9. LINUX系统编程 LINUX 虚拟内存

    LINUX 虚拟内存 以32位操作系统为例子,因为64位系统虚拟地址过大为2^64,32位仅仅为2^32=4G更利于描述,但是原理东西都一样 这首先要从程序和进程之间的关系开始,我们一般写好一段C\C ...

  10. 【Linux系统编程】文件IO操作

    文件描述符 在 Linux 的世界里,一切设备皆文件.我们可以系统调用中 I/O 的函数(I:input,输入:O:output,输出),对文件进行相应的操作( open().close().writ ...

最新文章

  1. 我的.net程序为何不能执行?
  2. #Apache Spark系列技术直播# 第六讲【 What's New in Apache Spark 2.4? 】
  3. vi查找替换命令详解
  4. VTK:模型之DelaunayMesh
  5. android-support安装不,导入android.support无法解析
  6. js控制的动画,显示隐藏(元素,动画,显示隐藏)
  7. Tomcat下载安装及配置
  8. 用 WebGL 探索动画和交互技术(一个学习案例)
  9. java wed 1
  10. Face Swapping: Automatically Replacing Faces in Photographs论文阅读
  11. 11.21的自动锁屏 ios_iPhone11 的新手小技巧
  12. 第十三届——蓝桥杯嵌入式第二场
  13. 深入理解插入排序(why二分插入排序中left就是待插入位置)
  14. 塔望 - 食品品牌咨询 食品品牌全案策划服务公司
  15. 微网站 源码 php,php 微网站 实例源码(pc手机平板 均可浏览)
  16. script标签放在页面头部和尾部的区别
  17. 微信H5支付(V3)
  18. PDF怎样转换成JPG图片 PDF转换为JPG图片教程 1
  19. vue修改编码_【Vue】为什么直接改node_modules里面的代码,不会生效?
  20. HDU1068Girls and Boys

热门文章

  1. 解决Windows 8系统假死的方法
  2. vbs脚本编程与windows批处理命令初体验
  3. kirin710f是什么处理器_如何看待麒麟710F处理器?
  4. android 随手记代码,用ExpandableListView写的随手记实例
  5. 魅族用鸿蒙系统吗,魅族宣布接入鸿蒙是怎么回事?魅族手机可以刷鸿蒙系统吗?...
  6. Java黑皮书课后题第8章:8.9(井字游戏)玩家使用各自标志标记3*3网格中的某个空格,当一个玩家在网格的水平、垂直或对角线方向标记了三个相同的标记时,游戏结束,该玩家获胜。创建一个玩井字游戏的程序
  7. C语言学习用迭代法求x=√a
  8. 小学经历——我家有猪
  9. ?类型 ,?类型(值)
  10. 安装Ubuntu 18.04后的一些操作