文件描述符常量(unistd.h):

  • STDIN_FILENO
  • STDOUT_FILENO
  • STDERR_FILENO

通常这些常量分别对应于数字0,1,2

文件操作需要头文件 fcntl.h ,一些常量需要头文件unistd.h

  • open int open(const char *pathname, int oflag, ... )

    • 其中oflag可以是以下值的集合

      • O_RDONLY、O_WRONLY、O_RDWR 读写属性
      • O_APPEND、O_CREAT、O_EXCL、O_TRUNC、O_NOCTTY、O_NONBLOCK
  • creat 等效于 open (pathname, O_WRONLY | O_CREAT | O_TRUNC, mode);
  • closeint close(int filedes);
  • lseek off_t lseek(int filedes, off_t offset, int whence); 
    • 与偏移 offset 相对的位置whence:

      • SEEK_SET 文件起始
      • SEEK_CUR 当前位置
      • SEEK_END 文件末尾
  • write ssize_t write(int filedes, const void *buf, size_t nbytes);

生成有洞的文件

使用lseek跳到文件原大小之外的范围然后写入数据,那么中间的部分数据不会被真正存储,不过读取是都当做0看待,但ls看到的文件大小还是将中间这些算进去的,这样可以非常快速的生成较大的空白文件。

 #include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <limits.h>
#include <string.h> char file_header[] = "this is the file header msg.";
char file_end[] = "now we reach the file end."; int main() {
printf("size of off_t: %ld\n", sizeof(off_t));
printf("max file open number: %ld\n", sysconf(_SC_OPEN_MAX));
printf("max name length: %d\n", _POSIX_NAME_MAX);
printf("max path length: %d\n", _POSIX_PATH_MAX); int fd = open("tmpfile", O_RDWR | O_CREAT | O_TRUNC); if (fd < ) {
perror("file operation open");
return ;
} int head_len = strlen(file_header);
int end_len = strlen(file_end); if (write(fd, file_header, head_len) != head_len) {
perror("write file header msg failed.");
} if (lseek(fd, , SEEK_SET) == -) {
perror("lseek failed.");
} if (write(fd, file_end, end_len) != end_len) {
perror("write file end msg failed.");
} if (close(fd) < ) {
perror("file operation close");
}
return ;
}

缓存影响I/O效率

由于有预读取的过程存在使用缓存可以提高复制速度,但是当缓存超过其预读取大小时缓存作用就降低了

 #include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h> char buffer[ * ]; int main(int argc, char* argv[]) {
if (argc < ) {
fprintf(stderr, "usage:\n\t%s <buffer_size>\n", argv[]);
return ;
} int buffer_size = ;
sscanf(argv[], "%d", &buffer_size); if (buffer_size > sizeof(buffer)) {
fprintf(stderr, "buffer size too big. max: %ld\n", sizeof(buffer));
return ;
} int bytes_read = ; while ((bytes_read = read(STDIN_FILENO, buffer, buffer_size)) > ) {
if (write(STDOUT_FILENO, buffer, bytes_read) != bytes_read) {
fprintf(stderr, "write error.\n");
}
} if (bytes_read < ) {
fprintf(stderr, "read error.\n");
} return ;
}

测试了使用不同缓存的情况下IO效率(比较随意):

Linux中的fd设备

Unix Programming :文件IO的更多相关文章

  1. (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  2. UNIX高级环境编程(14)文件IO - O_DIRECT和O_SYNC详解 < 海棠花溪 >

    春天来了,除了工作学习,大家也要注意锻炼身体,多出去运动运动.  上周末在元大都遗址公园海棠花溪拍的海棠花.   进入正题. O_DIRECT和O_SYNC是系统调用open的flag参数.通过指定o ...

  3. Unix环境高级编程:文件 IO 原子性 与 状态 共享

    参考 UnixUnix环境高级编程 第三章 文件IO 偏移共享 单进程单文件描述符 在只有一个进程时,打开一个文件,对该文件描述符进行写入操作后,后续的写入操作会在原来偏移的基础上进行,这样就可以实现 ...

  4. Unix系统编程()深入探究文件IO概述

    open调用将引入原子atomicity操作的概念. 将某一系统调用所要完成的各个动作作为不可中断的操作,一次性加以执行. 原子操作是许多系统调用得以正确执行的必要条件. 还介绍一个系统调用fcntl ...

  5. Unix环境编程之文件IO

    1.文件IO 2.文件与目录 3.进程 4.多线程编程 5.信号 6.进程间通信 学习linux编程,首先要学会使用shell,这里一些基础命令就不介绍了.这里唯一要提的一个shell命令就是man. ...

  6. linux系统编程--文件IO

    系统调用 什么是系统调用: 由操作系统实现并提供给外部应用程序的编程接口.(Application Programming Interface,API).是应用程序同系统之间数据交互的桥梁. C标准函 ...

  7. 转:Linux 文件IO理解

    源地址http://blog.csdn.net/lonelyrains/article/details/6604851 linux文件IO操作有两套大类的操作方式:不带缓存的文件IO操作,带缓存的文件 ...

  8. 文件IO函数和标准IO库的区别

    摘自 http://blog.chinaunix.net/uid-26565142-id-3051729.html 1,文件IO函数,在Unix中,有如下5个:open,read,write,lsee ...

  9. 文件IO

    在unix世界中视一切为文件,无论最基本的文本文件还是网络设备或是u盘,在内核看来它们的本质都是一样的.大多数文件IO操作只需要用到5个函数:open . read . write . lseek 以 ...

  10. Golang文件IO 一

    Golang文件IO 一 文件IO编程最基本.最常用的就属读写文件操作了.ioutil包实现了一些IO实用功能,其中就包括非常简捷.好用的文件读取功能. ioutil包有7个函数1个变量: var D ...

随机推荐

  1. Sublime Text 格式化JSON-pretty json

    1.安装install package 按control + `,打开命令输入框 输入一下命令: import urllib2,os; pf='Package Control.sublime-pack ...

  2. docker容器的基本操作

    docker容器是独立运行的一个或一组应用,以及它们的运行态环境.下面具体介绍如何管理一个容器,包括容器的创建,启动和停止等. 启动容器 基于镜像新建一个容器并启动 将终止状态的容器重新启动 新建并启 ...

  3. cmd下查看应用端口情况

    在win10开始窗口右侧的空白处点击CMD,在上方弹出窗口中选择命令提示符,双击进入 在弹出命令界面中,输入netstat -na命令后回车,如下图所示,可以看到所有目前打开的端口 如果要查看打开端口 ...

  4. EL表达式中的11个隐式对象

    EL表达式中定义了11个隐式对象,使用这些隐式对象可以很方便地读取到Cookie.HTTP请求消息头字段.请求参数.Web应用程序中的初始化参数的信息,EL表达式中的隐式对象具体如下: 隐式对象 作用 ...

  5. POJ 1126

    #include <stdio.h> #include <string> #include <iostream> using namespace std; int ...

  6. js05

    继续学习js,在这里我们主要讲述一下js的BOM(浏览器对象模型)以及一些js库和应用这些js库的方法. 1.浏览器对象模型(BOM):    window对象:        表示浏览器窗口,所有的 ...

  7. Ubuntu18.04 Redis主从复制

    1.下载安装redis http://download.redis.io/releases/ 2.建立一个主7060和一个从7061文件 3.在两个文件夹中建立用于存放数据得db文件和存日志得log文 ...

  8. hanlp的基本使用--python(自然语言处理)

    hanlp拥有:中文分词.命名实体识别.摘要关键字.依存句法分析.简繁拼音转换.智能推荐. 这里主要介绍一下hanlp的中文分词.命名实体识别.依存句法分析,这里就不介绍具体的hanlp的安装了,百度 ...

  9. 解决ajax跨域问题的一种方法

    解决ajax跨域问题的一种方法 前后端分离经常用json来传输数据,比较常见的问题就有ajax跨域请求的错误问题,这里是我的一种解决方法: 在java中加入如下的注解类: import org.spr ...

  10. JVM-压缩指针

    什么是压缩指针: 通常64位JVM消耗的内存会比32位的最多会多用1.5倍,这是因为对象指针在64位架构下,对象指针长度会翻倍. 对于那些将要从32位平台移植到64位的应用来说,平白无辜多了1/2的内 ...