首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

UNIX环境高级编程-I/O

2013-09-25 
UNIX环境高级编程--I/O这里讲述的I/O包括四部分的:文件I/O、标准I/O库、高级I/O,终端I/O。这四部分在《unix环

UNIX环境高级编程--I/O
这里讲述的I/O包括四部分的:文件I/O、标准I/O库、高级I/O,终端I/O。这四部分在《unix环境高级编程》中是分开的三章,这里提取放在一块说更有课比性。一、文件I/O

           可用的文件I/O函数--打开文件、读文件、写文件等、unix系统中的大所属I/O需用到的五个函数:open、read、write、lseek以及close..这些函数经常被称为不带缓冲区的I/O(与下面将要讲述的标准I/O相对照)。术语不带缓冲指的是每个read和write都调用内核中的一个系统调用。这些不带缓冲的I/O函数不是ISO C的组成部分,但是,他们是POSIX。1和Single UNIX Specification的组成部分。还需要通过文件I/O和open函数的参数来讨论原子操作的概念,只要涉及在多个进程间共享资源,这个概念就很重要。多个进程间是如何贡献文件,以及所涉及的内核数据结构。还会说明dup、fcntl、sync、fsync和ioctl函数。

 

#inlcude <unistd.h>

off_t lseek(int fileds,off_t offset,int whence);

对参数offset的解释与参数whence的值有关。

若whence是SEEK_SET,则该文件的偏移量设置为距文件开始offset个字节。

若whence是SEEK_CUR,则该文件的偏移量为从当前位置开始offset个字节,可正可负。

若whence是SEEK_END,则该文件的偏移量为从文件的末尾开始offset个字节,可正可负。

    对于普通文件,写操作从文件的当前偏移量开始。如果在打开该文件时,指定了O_APPEND选项,则在每次写操作之前,将文件偏移量设置在文件的当前结尾处,在一次成功写之后,该文件偏移量增加实际写的字节数。

    #include <unistd.h>

int dup(int filedes);

int dup2(int filedes,int fileses2);

由dup返回的新文件描述符一定是当前可用文件描述符中最小数值。用dup2则可以用filedes2参数指定新描述符的数值。如果fiedes2已经打开,则先将其关闭。如若filedes等于filedes2,则dup2返回fiedes2,而不关闭它。这些函数返回的新文件描述符与参数filedes共享同一个文件表项。

例如:newfd=dup(1);

当此函数开始执行时,假设下一个可用的描述符为3,。因为两个描述符向同一个文件表项,所以他们共享同一个文件状态标志(读、写、添写等)以及同一当前文件偏移量。

    复制一个描述符的另一个方法是fcntl函数:

调用dup(filedes);

等效于fcntl(filedes,F_DUPFD,0);

而调用dup2(filedes,filedes2);

等效于

close(filedes2);

fcntl(filedes,F_DUPFD,filedes2);

在后一种情况下,dup2并不完全等同于close加上fcntl。区别为:

    dup2是一个原子操作,而close及fcntl则包括两个函数调用。有可能在close和fcntl之间插入执行信号捕获函数,它可能修改文件描述符。

    dup2和fcnlt有某些不同的errno。


#include <unistd.h>

int fsync(int filedes);

int fdatasync(int filedes); //返回值:若成功则返回0,若出错则返回-1

voud sync(void);


两个重要的函数:

#include <unistd.h>

int fcntl(int fiedes,int cmd,...../* int arg */);

//若成功则依赖于cmd,若出错则返回-1。

第三个参数可能是一个整数,也有可能是一个指向结构的指针。

函数的五个功能:

1)复制一个现有的描述符(cmd=F_DUPFD)

2)获得/设置文件描述符标记(cmd=F_FETFD或F_SETFD)

3)

    #include <unistd.h>

#include <sys/ioctl.h>

#include <stropts.h>

int ioctl(int filedes,int request,.....); //若出错则返回-1,若成功则放回其他值。

二、标准I/O库

            标准I/O库处理很多细节,例如缓冲区分配,以优化长度执行I/O等。

三、高级I/O

           包括非阻塞I/O、记录锁、系统V流机制、I/O多路回转(select和poll函数)、readv和writev函数以及存储映射I/O(mmap),这些都是高级I/O.

    标准I/O库提供缓冲的目的是尽可能减少使用read和write调用的次数。

标准I/O提供了三种类型的缓冲:

1)全缓冲。这种情况下,在填满标准I/O缓冲区后才进行实际I/O操作。对于驻留在磁盘上的文件通常是由标准I/O库实施全缓冲的。在一个流上执行第一次I/O操作时,相关标准I/O函数通常调用malloc获得需使用的缓冲区。

2)行缓冲。在这种情况下,当在输入和输出中遇到换行符是,标准I/O库执行I/O操作。这允许我们一次输出一个字符(标准I/Ofputc函数),但只有在写了一行之后才进行实际I/O操作。当流涉及一个终端时(例如标准输入和标准输出),通常使用行缓冲。

3)不带缓冲。标准I/O库不对字符进行缓冲存储。例如,如果用标准I/O函数fputs写15个字符到不带缓冲的流中,则该函数很可能用上面讲述的write系统调用函数将这些字符立即写至关联的打开的文件上。

四、终端I/O


热点排行