`
jxsrhsb
  • 浏览: 16051 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

第三章 文件I/O 一

阅读更多
一,名词说明

文件描述符
    针对内核,所有打开文件都是文件描述符引用.文件描述符是一个非负数整数.当打开一个现存文件或创建一个新的文件时,内核向进程返回一个文件描述符.
    按照惯例,UNIX shell使用描述符0与进程的标准输入相结合,文件描述符1与标准输出相结合,文件描述符2与标准出错输出相结合.这些是UNIX shell以及很多应用程序的惯例,与内核无关.不遵照这种惯例,很多UNIX应用程序就不能工作.

magic number(幻数)
    幻数检查用来检查文件中是否有特殊的固定格式的数据.规范的例子如二进制可执行文件(编译后的程序)a.out,该文件格式在标准include目录下的a.out.h文件中定义,也可能在exec.h中定义.这些文件在文件开始部分附近的一个特殊位置保存有一个'幻数',通过幻数告诉UNIX操作系统此文件是二进制可执行文件,和其中包含的其它类型.幻数的概念已经扩展到数据文件.任何在文件固定位置有与文件类型相关的不变标识符的文件都可以这样表示.这些文件中的信息可以从幻数文件/usr/share/magic中读取.

二,常数说明

O_RDONLY只读打开
O_WRONLY只写打开
O_RDWR读,写打开
O_APPEND每次写时都加到文件尾端
O_CREAT若文件不存在则创建它
O_EXCL测试文件存不存在.与O_CREAT同时使用时,文件存在会报错
O_TRUNC如果文件存在,而且为只读或只写成功打开,则将其程度截短为0
O_NOCITY如果pathname指的是终端设备,则不将此设备分配作为此进程的控制终端
O_SYNC使每次write都等到物理I/O操作完成

注意:很多实现将O_RDONLY定义为0,O_WRONLY定义为1,O_RDWR定义为2.

三,函数

open函数:打开或创建一个文件
int open(const char* pathname, int oflag, ... /*, mode_t mode */) 返回:成功 文件描述符,出错 -1

creat函数:创建一个新的文件
int creat(const char* pathname, mode_t [/i])返回:成功为只写描述符,出错为-1
注意:open(pathname, O_WRONLY|O_CREAT|O_TRUNC, [i]mode
);creat函数只以只写方式打开所创建的文件

close函数:关闭一个打开文件
int close(int filedes)返回:成功 0,出错 -1
关闭一个文件时也释放该进程加在该文件上的所有记录锁.当一个进程终止时,它所有的打开文件都由内核自动关闭.很多程序都使用这一功能而不显示地用close关闭打开的文件.

lseek函数
off_t lseek(int filedes, off_t offset, int whence)返回:成功 新的文件位移,出错 -1
whence
SEEK_SET将该文件的位移量设置为距文件开始处offset个字节
SEEK_CUR将该文件的位移量设置为其当前值加offset,offset可为+/-
SEEK_END将文件的位移量设置为文件长度加offset,offset可为+/-

每个打开文件都有一个与其相关联的"当前文件位移量".它是一个非负整数,用一度量从文件开始处计算的字节数.通常,读写操作都从当前文件位移量处开始,并事位移量增加所读或写的字节数.
off_t currpos;
currpos = lseek(fd, 0, SEEK_CUR);

以上方式可以确定一个打开文件的当前位移量,也可以用这种方法来确定所涉及的文件是否可以设置位移量.如果文件描述符引用的是一个管道或FIFO,则lseek返回-1,并将errno设置为EPIPE.
eg.
#include <sys/types.h>
#include "ourhdr.h"

int mian(void)
{
    if(lseek(STDIN_FIFENO, 0, SEEK_CUR) == -1) //必须用==-1,而不能用是否小于0,因为某些设备允许负值
        printf("cannot seek\n");
    else
        printf("seek OK\n");
    exit(0);
}

lseek仅将当前位移量记录在内核内,并不引起任何I/O操作.然后位移量用于下一个读或写操作.
当文件位移量大于当前文件的长度时,该文件的下一次写将延长该文件,并在文件种构成一个空调,该文件没有写过的字节都被读为0.
eg.
#include <sys/types.h>
#include <sys/stat.h>
#include "ourhdr.h"

char buf1[] = "abcdefghijklmnopqrstuvwxyz";
char buf2[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

int main(void)
{
    int fd;

    if((fd = creat("file.hole", FILE_MODE)) < 0)
        err_sys("creat error");

    if (write(fd, buf1, 10) != 10)
        err_sys("buf1 write error");

    if(lseek(fd, 40, SEEK_SET) == -1)
        err_sys("lseek error");

    if(write(fd, buf2, 10) != 10)
        err_sys("buf2 write error");

    exit(0);
}


read函数:从打开文件中读数据
ssize_t rea(int filedes, void buff, size_t nbytes)返回:读到的字节数,文件结尾 0,出错 -1
际读到的字节数少于要求读字节数的情况:
  • 读普通文件时,在读到要求字节数之前已到达了文件尾端。例如,若在到达文件尾端之前还有30个字节,而要求读 100个字节,则read返回30,下一次再调用read时,它将返回0(文件尾端)。
  • 当从终端设备读时,通常一次最多读一行。
  • 当从网络读时,网络中的缓冲机构可能造成返回值小于所要求读的字节数。
  • 某些面向记录的设备,例如磁带,一次最多返回一个记录。

write函数:向打开文件写数据
ssize_t write(int filedes, const void buff, size_t nbytes返回:成功 以写的字节数 出错 -1
其返回值通常与参数nbytes的值相同,否则表示出错.write出错的常见原因:磁盘已写满,或者超过了对一个给定进程的文件长度限制.
分享到:
评论

相关推荐

    UNIX环境高级编程.pdf

    第3章文件I / O 第4章文件和目录 第5章标准I/O 库 第6章系统数据文件和信息 第7章U N I X进程的环境 第8章进程控制 第9章进程关系 第10章信号 第11章终端I / O 第1 2章高级I / O 第1 3章精灵进程 第1 4章进程间通信 ...

    unix环境高级编程

    第3章 文件I/O 第四章〓文件和目录 第五章〓标准I/O库 第六章〓系统数据文件和信息 第七章〓Unix进程的环境 第八章〓进程控制 第九章〓进程关系 第十章:信号 第11章 终端I/O 第十二章 高级I/O 第十三章 精灵进程 第...

    unix环境高级编程.rar

    第3章 文件I/O 35 第4章 文件和目录 54 第5章 标准I/O库 91 第6章 系统数据文件和信息 110 第7章 UNIX进程的环境 122 第8章 进程控制 141 第9章 进程关系 180 第10章 信号 198 第11章 终端I/O 246 第12章 高级I/O ...

    unix 高级编程(上)

    第 3章 文件I/O 547K 第 4章 文件和目录 1.1M 第 5章 标准I/O库 538K 第 6章 系统数据文件和信息 351K 第 7章 UNIX进程的环境 597K 第 8章 进程控制 1.2M 第 9章 进程关系 562K 第10章 信号 1.6M 第11章 ...

    Turbo C高级程序员编程指南

    第三章 基本键盘、鼠标器及屏幕I/O 第四章 弹出窗口和错误报告 第五章 文件I/O 第六章 串函数库 第七章 高级指针和内存分配技术 第八章 Turbo C通用编程 第九章 目录实用程序 第十章 高级文件I/O 第十一章 Turbo C...

    Linux下C编程函数手册/linux下C编程必备函数大全

    第3章 内存配置函数 第4章 时间函数 第5章 字符串处理函数 第6章 数学计算函数 第7章 用户和组函数 第8章 数据加密函数 第9章 数据结构函数 第10章 随机数函数 第11章 初级I/O函数 第12章 标准I/O函数 第13章 进程及...

    UNIX环境高级编程

    (第三章)文件和目录 (第四章)标准I/O库 (第五章)以及系统数据文件 (第六章)进程—Unix进程的环境 (第七章)进程控制 (第八章)进程之间的关系 (第九章)以及信号 (第十章)终端I/O (第十一章)、高级I...

    Linux C 函数库参考手册 中文版

    第3章 内存配置函数 第4章 时间函数 第5章 字符串处理函数 第6章 数字计算函数 第7章 用户和组函数 第8章 数据加密函数 第9章 数据结构函数 第10章 随机数函数 第11章 初级 I/O 函数 第12章 标准I/O函数 第13章 进程...

    UNIX网络编程卷2进程间通信(第2版)

    第3章 套接口编程简介 第4章 基本TCP套接口编程 第5章 TCP客户/服务器程序例子? 第6章 I/O复用:select和poll函数 第7章 套接口选项 第8章 基本UDP套接口编程 第9章 基本SCTP套接口编程 第10章 SCTP客户/服务器程序...

    UNIX环境高级编程(第2版)书和源码

    第3章 文件I/O 47 第4章 文件和目录 71 第5章 标准I/O库 109 第6章 系统数据文件和信息 133 第7章 进程环境 147 第8章 进程控制 171 第9章 进程关系 213 第10章 信号 233 第11章 线程 287...

    UNIX环境高级编程(第三章)

    第3章 文件I/O 35 3.1 引言 35 3.2 文件描述符 35 3.3 open函数 35 3.4 creat函数 37 3.5 close函数 37 3.6 lseek函数 38 3.7 read函数 40 3.8 write函数 41 3.9 I/O的效率 41 3.10 文件共享 42 3.11 原子操作 45 ...

    16入16出单片机I/O工业控制器型号JMDM-32DIOMR.rar

    第三路继电器输出: 关:O(00,03,0)E,开:O(00,03,1)E; 第四路继电器输出: 关:O(00,04,0)E,开:O(00,04,1)E; ........第16路继电器输出: 关:O(00,16,0)E,开:O(00,16,1)E;16路全部继电器输出: 关:O(00,00,0)E,开:...

    C++高级程序设计实验十二模板类的构造& C++的I/O流类库

    C++高级程序设计实验十二模板类的构造& C++的I/O流类库 1.理解和应用类模板和...3.有一名为test.txt的文件,里面分两行分别存储了整数12345678和字符串abcdefg,设计两个完整的程序,第一个程序以文本文件的方式存

    20操作系统课件.rar

    【知识强化】第三章 内存管理 【知识强化】第四章 文件管理 【知识强化】第五章 输入/输出(I/O)管理 【习题讲解】第一章 操作系统概述 【习题讲解】第二章 进程管理 【习题讲解】第三章 内存管理 【习题讲解...

    UNIX环境高级编程_第二版中文

    第3章 文件I/O  3.1 引言  3.2 文件描述符  3.3 open函数  3.4 creat函数  3.5 close函数  3.6 lseek函数  3.7 read函数  3.8 write函数  3.9 I/O的效率  3.10 文件共享  3.11 原子操作  ...

    linux系统编程《Linux System Programming》

    第3章:缓冲输入输出 第4章:高级文件I/O 第5章:进程管理 第6章:高级进程管理 第7章:文件与目录管理 第8章:内存管理 第9章:信号 第10章:时间 附录 A GCC对C语言的扩展 附录 B 参考书目 **********************...

    深圳精敏工业级别20点I/O工控板JMDM-12DIO8AIO.rar

    深圳精敏工业级别20点I/O工控板JMDM-12DIO8AIOrar,一、简介 JMDM-12DIO8AIO是深圳市精敏数字机器有限公司自主研发的一款具有8路光电隔离数字量输入和4路模拟量输入,4路继电器输出和4路模拟量输出,高可靠稳定性的...

    操作系统期末复习资料

    第4讲 文件系统与文件I/O 主要内容: 文件管理层次结构 了解标准I/O库、RIO库特点及使用场合 掌握系统I/O库的使用:read/write/open/lseek/close,能分析程序案例 内核文件I/O数据结构,文件打开过程、文件关闭...

    Python讲义笔记资源

    疯狂Python讲义笔记是一个Python基础入门到进阶知识手册,对照原文的...第12章 文件I/O 第13章 数据库编程 第14章 并发编程 第15章 网络编程 第16章 文档和测试 第17章 打包和发布 第18章 合金弹头 第19章 数据可视化

Global site tag (gtag.js) - Google Analytics