上一页 1 ··· 33 34 35 36 37 38 39 40 41 ··· 59 下一页
摘要: 较新的系统都提供名为/dev/fd的目录,其目录项是名为0、1、2等的文件。打开文件/dev/fd/n等效于复制描述符n(假定描述符n是打开的)。在下列函数调用中:fd = open( "/dev/fd/0", mode );大多数系统忽略它所指定的mode,而另外一些则要求mode必须是所涉及的文件(在这里则是标准输入)原先打开时所使用的mode的子集。因为上面的打开等效于:fd = dup( 0 );所以描述符0和fd共享同一文件表项。例如,若描述符0先前被打开为只读,那么我们也只能对fd进行读操作。即使系统忽略打开模式,并且下列调用成功:fd = open( &quo 阅读全文
posted @ 2014-01-01 09:04 ITtecman 阅读(2268) 评论(0) 推荐(0) 编辑
摘要: ioctl函数是I/O操作的杂物箱。不能用其他函数表示的I/O操作通常都能用ioctl表示。终端I/O是ioctl的最大使用方面。ioctl函数通过对文件描述符发送特定的命令来控制文件描述符所代表的设备。#include /* System V */#include /* BSD and Linux */#include /* XSI STREAMS */int ioctl( int filedes, int request, ... );返回值:若出错则返回-1,若成功则返回其他值对于ISO C原型,它用省略号表示其余参数。但是,通常只有另外一个参数,它常常是... 阅读全文
posted @ 2014-01-01 08:45 ITtecman 阅读(11350) 评论(0) 推荐(0) 编辑
摘要: fcntl函数可以改变已打开的文件的性质。#include int fcntl( int filedes, int cmd, ... /* int arg */ );返回值:若成功则依赖于cmd,若出错则返回-1在本节的各实例中,第三个参数总是一个整数,与上面所示函数原型中的注释部分相对应。但是在说明记录锁时,第三个参数则是指向一个结构的指针。fcntl函数有5种功能:(1)复制一个现有的描述符(cmd = F_DUPFD )。(2)获得/设置文件描述符标记(cmd = F_GETFD或F_SETFD)。(3)获得/设置文件状态标志(cmd = F_GETFL或F_SETFL)。(4)获得/设 阅读全文
posted @ 2014-01-01 08:24 ITtecman 阅读(1169) 评论(0) 推荐(0) 编辑
摘要: 传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘I/O都通过缓冲进行。当将数据写入文件时,内核通常先将数据复制到其中一个缓冲区中,如果 该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重用该缓冲区以便存放其他磁盘块数据时,再将该缓冲排入输出队列,然后等待其到达队首时,才进行实际的I/O操作。这种输出方式被称为延迟写(delayed write)。延迟写减少了磁盘读写次数,但是却降低了文件内容的更新速度,使得欲写到文件中的数据在一段时间内并没有写到磁盘上。当系统发生故障时,这种延迟写可能造成文件更新内容的丢失。为了保证磁盘实际文件系统与缓冲区高速缓存中 阅读全文
posted @ 2013-12-31 09:18 ITtecman 阅读(1496) 评论(0) 推荐(1) 编辑
摘要: 下面两个函数都可用来复制一个现有的文件描述符:#include int dup( int filedes );int dup2( int filedes, int filedes2 );两函数的返回值:若成功则返回新的文件描述符,若出错则返回-1由dup返回的新文件描述符一定是当前可用文件描述符中的最小数值。用dup2则可以用filedes2参数指定新描述符的数值。如果filedes2已经打开,则先将其关闭。如若filedes等于filedes2,则dup2返回filedes2,而不关闭它。这些函数返回的新文件描述符与参数filedes共享同一个文件表项。图3-3显示了这种情况。在此图中,我们 阅读全文
posted @ 2013-12-31 08:59 ITtecman 阅读(798) 评论(0) 推荐(0) 编辑
摘要: 一、添写至一个文件考虑一个进程,它要将数据添加到一个文件尾端。早期的UNIX系统并不支持open的O_APPEND选项,所以程序被编写成下列形式:if( lseek( fd, 0L, 2 ) ssize_t pread( int filedes, void *buf, size_t nbytes, off_t offset );返回值:读到的字节数,若已到文件结尾则返回0,若出错则返回-1ssize_t pwrite( int filedes, const void *buf, size_t nbytes, off_t offset );返回值:若成功则返回已写的字节数,若出错则返回-1调用p 阅读全文
posted @ 2013-12-31 08:24 ITtecman 阅读(680) 评论(0) 推荐(0) 编辑
摘要: UNIX系统支持在不同进程间共享打开的文件。内核使用三种数据结构表示打开的文件,它们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响。(1)每个进程在进程表中都有一个记录项,记录项中包含有一张打开文件描述符表,可将其视为一个矢量,每个描述符占用一项。与每个文件描述符相关联的是: (a)文件描述符标志(close_on_exec)。进程中每个打开描述符都有一个执行时关闭(close_on_exec)标志,若此标志设置,则在执行exec时关闭该描述符,否则该描述符仍打开。除非特地用fcntl设置了该标志,否则系统默认操作是在执行exec后仍保持该描述符打开。 (b)指向一个文件表项 阅读全文
posted @ 2013-12-30 21:53 ITtecman 阅读(1187) 评论(0) 推荐(0) 编辑
摘要: 程序清单3-3中的程序使用read和write函数复制文件。关于该程序应注意下列各点:它从标准输入读,写至标准输出,这就假定在执行本程序之前,这些标准输入、输出已由shell安排好。确实,所有常用的UNIX系统shell都提供一种方法,它在标准输入上打开一个文件用于读,在标准输出上创建(或重写)一个文件。这使得程序不必自行打开输入和输出文件。很多应用程序假定标准输入是文件描述符0,标准输出是文件描述符1。本示例中则使用在中定义的两个名字:STDIN_FILENO和STDOUT_FILENO。考虑到进程终止时,UNIX系统内核会关闭该进程的所有打开的文件描述符,所以此示例并不会关闭输入和输出文件 阅读全文
posted @ 2013-12-30 17:58 ITtecman 阅读(512) 评论(0) 推荐(0) 编辑
摘要: 调用write函数向打开的文件写数据。#include ssize_t write( int filedes, const void *buf, size_t nbytes );返回值:若成功则返回已写的字节数,若出错则返回-1。其返回值通常与参数nbytes的值相同,否则表示出错。write出错的一个常见原因是:磁盘已写满,或者超过了一个给定的进程的文件长度限制。对于普通文件,写操作从文件的当前偏移量处开始。如果在打开该文件时,指定了O_APPEND选项,则在每次写操作之前,将文件偏移量设置在文件的当前结尾处。在一次成功写之后,该文件偏移量增加实际写的字节数。本篇博文内容摘自《UNIX环境高 阅读全文
posted @ 2013-12-30 17:16 ITtecman 阅读(484) 评论(0) 推荐(0) 编辑
摘要: 调用read函数从打开文件中读数据。#include ssize_t read( int filedes, void *buf, size_t nbytest );返回值:若成功则返回读到的字节数,若已读到文件结尾则返回0,若出错则返回-1。有多种情况可是实际读到的字节数少于要求读的字节数:读普通文件时,在读到要求字节数之前已到达了文件尾端。当从终端设备读时,通常一次最多读一行。当从网络读时,网络中的缓冲机构可能造成返回值小于所要求读到字节数。当从管道或FIFO读时,如若管道包含的字节数少于所需的数量,那么read将只返回实际可用的字节数。当从某些面向记录的设备(例如磁带)读时,一次做多返回一 阅读全文
posted @ 2013-12-30 17:09 ITtecman 阅读(458) 评论(0) 推荐(0) 编辑
上一页 1 ··· 33 34 35 36 37 38 39 40 41 ··· 59 下一页