[unix]unix I/O知识

0.UNIX输入输出基本概念

Q1.程序与文件建立连接或通信有几种机制?流与文件描述字有什么区别?  Q2.打开文件的实质?

打开文件就是程序与文件之间建立连接或通信。 

流的类型是FILE;

文件描述字的类型是int;

流函数建立在文件描述字之上。

1.标准I/O 【针对流】

a. NULL

b.流与FILE对象

对于ASCII字符集,一个字符用一个字节表示。对于国际字符集,一个字符可用多个字节表示。

流的定向决定了所,读写的字符是单字节还是多字节的。

若在未定向的流上使用一个多字节I/O函数,则将该流的定向设置为宽定向的。

若在未定向的流上使用一个单字节I/O函数,则将该流的定向设置为字节定向的。

freopen()清除一个流的方向;fwide()设置流的定向,但并不改变已定向流的方向。

c.打开与关闭流

fopen() 打开一个指定的文件

freopen() 在一个指定的流上打开一个指定的文件,如果该流已经打开,则先关闭该流。若该流已经定向,则freopen清除该定向。一般用于将一个指定的文件打开为一个预定义的流:标准输入,标准输出或标准出错。

fdopen() 获取一个现有的文件描述符,并使一个标准的I/O流与该描述符相结合。 用于由创建管道和网络通信通道函数返回的描述符。

标准I/O系统可以区分文本文件和二进制文件,但UNIX并不对这两种文件进行区分,所以UNIX系统环境下制定字符b作为type一部分实际没作用。

流引用终端设备,则该流是行缓冲的; 否则系统默认情况,流被打开时是全缓冲的。

fclose()

进程正常终止时:

d.读写流 {读的方式不同;写的方式不同}

(1) 每次一个字符的I/O;getc(),fgetc(),getchar()

(2) 每次一行    调用fgets()时,说明能处理的最大行长。gets()

(3)直接I/O{二进制I/O}     fread()和fwrite(),每个对象具有指定的长度。从用于从二进制文件中每次读或写一个结构。

e.文件定位

(1)   ftell()和fseek()    V7就存在,文件位置存放在一个长整型中

(2)   ftello()和fseeko()    Single UNIX Specifcation  ,使用off_t数据类型代替了长整型。

(3)   fgetpos()和fsetpos()  ISO C 使用一个抽象的数据类型fpos_t记录文件的位置

需要移植到非UNIX系统上运行的应用程序应当使用fgetpos和fsetpos.

对于非UNIX环境,二进制文件和文本文件的偏移量位置的计算。

f.文件结束和错误指示器

g.流缓冲 {全缓冲,行缓冲,不带缓冲}

h.格式I/O {格式输入;格式输出}

i.临时文件

Q 一般暂存什么数据?有什么特点?应用场景?相关函数{tmpnam(), tempnam(), tmpfile()}?函数使用举例?

j.其它:

{ESPIP错误};

FILE结构体 [include/linux/fs.h]; 

Q 文件位置起什么作用? 为什么fgets()是危险的函数?读回退?

Q.用setvbuf实现setbuf; printf返回0值意味着什么?;

2.低级I/O 【针对描述字】

b1.read()和write()函数;b2.readv()和writev()函数

c.文件位置

d.文件复制 dup()和dup2()

e.fdopen()和fileno()

f.fcntl()

g.非阻塞I/O   {想到了周五看UNP的I/O模型}

阻塞I/O :调用必须等到操作完成,即读写到数据,才能返回。

h.fsync()和fdatasync()函数

3.终端I/O
http://blog.csdn.net/wubin1124/article/details/5155864
Q1.为何引入终端I/O
Q2.终端I/O概述,分为几种类型
?使用GTI提供的终端I/O控制函数改变终端的默认设置

4.高级I/O

参考:APUE;  《UNIX/Linux程序设计教程》;

/*wolflion(天行)整理,转载注明出处*/  2013.3.17 version1.0

原文地址:https://www.cnblogs.com/wolflion/p/2965194.html