摘要: 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) 编辑
摘要: 每个打开的文件都有一个与其相关联的“当前文件偏移量”(current file offset)。它通常是一个非负整数,用以度量从文件开始处计算的字节数。通常,读、写操作都从当前文件偏移量处开始,并使偏移量增加所读写的字节数。按系统默认情况,当打开一个文件时,除非指定O_APPEND选项,否则该偏移量被设置为0。可以调用lseek显示地为一个打开的文件设置其偏移量:#include off_t lseek( int filedes, off_t offset, int whence );返回值:若成功则返回新的文件偏移量,若出错则返回-1。对参数offset的解释与参数whence的值有关。(注 阅读全文
posted @ 2013-12-30 16:53 ITtecman 阅读(2505) 评论(0) 推荐(0) 编辑
摘要: 可调用close函数关闭一个打开的文件:#include int close( int filedes );返回值:若成功则返回0,若出错则返回-1。关闭一个文件时还会释放该进程加在该文件上的所有记录锁。当一个进程终止时,内核自动关闭它所有打开的文件。很多程序都利用了这一功能而不显示地用close关闭打开文件。本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/。 阅读全文
posted @ 2013-12-30 15:21 ITtecman 阅读(312) 评论(0) 推荐(0) 编辑
摘要: 本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/。也可调用creat函数创建一个新文件。#include int creat( const char *pathname, mode_t mode );返回值:若成功则返回为只写打开的文件描述符,若出错则返回-1。注意,此函数等效于:open( pathname, O_WRONLY | O_CREAT | O_TRUNC, mode );在早期的UNIX系统版本中,open函数的第二个参数只能是0、1或2,没有办法打开一个尚未存在的文件,因此需要另一个系统调 阅读全文
posted @ 2013-12-30 15:16 ITtecman 阅读(368) 评论(0) 推荐(0) 编辑
摘要: 调用open函数可以打开或创建一个文件。#include int open( const char *pathname, int oflag, ... /* mode_t mode */ );返回值:若成功则返回文件描述符,若出错则返回-1。我们将第三个参数写为...,ISO C用这种方法表明余下参数的数量及其类型根据具体的调用会有所不同。对于open函数而言,仅当创建新文件时才使用第三个参数。在函数原型中将此参数放置在注释中。pathname是要打开或创建的文件的名字。oflag参数可用来说明此函数的多个选项。用下列一个或多个常量进行“或”运算构成oflag参数(这些常量定义在头文件中):O 阅读全文
posted @ 2013-12-30 15:06 ITtecman 阅读(1175) 评论(0) 推荐(0) 编辑
摘要: 一、引言UNIX系统中大多数文件I/O只需用到5个函数:open、read、write、lseek以及close。这些函数经常被称为不带缓冲的I/O(unbuffered I/O)。术语不带缓冲指的是每个read和write都调用内核中的一个系统调用。这些不带缓冲的I/O函数不是ISO C的组成部分,但是,它们是POSIX.1和Single UNIX Specification的组成部分。二、文件描述符对于内核而言,所有打开的文件都通过文件描述符引用。文件描述符是一个非负整数。当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。当读或写一个文件时,使用open或write返回的 阅读全文
posted @ 2013-12-30 14:09 ITtecman 阅读(421) 评论(0) 推荐(0) 编辑
摘要: 就整体而言,这些不同的标准之间配合得相当好。但是我们也很关注它们之间的差别,特别是ISO C标准和POSIX.1之间的差别。ISO C定义了函数clock,它返回进程使用的CPU时间,返回值类型是clock_t。为了将此值变换成以秒为单位,将其除以在头文件中定义的CLOCKS_PER_SEC。POSIX.1定义了函数times,它返回其调用者及其所有终止子进程的CPU时间以及时钟时间,所有这些值都是clock_t类型值。sysconf函数用来获取每秒中的滴答数,用于表示times函数的返回值。有一个相同的术语,即每秒中的滴答数,但ISO C和POSIX.1的定义却不同。这两个标准也用同一数据类 阅读全文
posted @ 2013-12-30 10:46 ITtecman 阅读(351) 评论(0) 推荐(0) 编辑
摘要: 历史上,某些UNIX系统变量已与某些C数据类型联系在一起。例如,历史上主、次设备号一直存放在一个16位的短整型中,8位表示主设备号,另外8位表示次设备号。但是,很多较大的系统需要用多于256个值来表示其设备号,于是,就需要有一种不同的技术。头文件中定义了某些与实现有关的数据类型,它们被称为基本系统数据类型(primitive system data type)。还有很多这种数据类型定义在其他头文件中。在头文件中,这些数据类型都是用C的typedef功能来定义的。它们绝大多数都以_t结尾。表1 某些常用的基本系统数据类型类型说明caddr_t核心地址clock_t时钟滴答计数器(进程时间)com 阅读全文
posted @ 2013-12-30 10:32 ITtecman 阅读(347) 评论(0) 推荐(0) 编辑
摘要: 在头文件中定义了很多POSIX.1和XSI的符号。但是除了POSIX.1和XSI的定义之外,大多数实现在这些头文件中也加上了它们自己的定义。如果在编译一个程序时,希望它只使用POSIX定义而不使用任何实现自己定义的限制,那么就需要定义常量_POSIX_C_SOURCE。所有POSIX.1头文件中都使用此常量。当定义该常量时,就能排除任何实现专有的定义。注:POSIX.1标准的以前版本都定义了_POSIX_SOURCE常量。在POSIX.1的2001版中,它被替换为_POSIX_C_SOURCE。常量_POSIX_C_SOURCE及_XOPEN_SOURCE被称为功能测试宏(feature te 阅读全文
posted @ 2013-12-30 09:59 ITtecman 阅读(1080) 评论(0) 推荐(0) 编辑
摘要: POSIX.1的2001版,包括了ISO C标准所指定的各个函数。其接口分成了两类:必需接口和可选接口。可选接口按功能又进一步分成50个区。表1中按它们各自的选项代码总结了没有被弃用的编程接口。选项代码是由2-3个字符构成的字母缩写,以便标识属于各个功能区的接口。选项代码会突出显示手册相关页面上的文本,表明接口依赖于对特定选项的支持。很多选项处理实时扩展。表1 POSIX.1可选接口组和代码(SUS,Single UNIX Specification)代码SUS强制要求符号常量说明ADV_POSIX_ADVISORY_INFO建议性信息(实时)AIO_POSIX_ASYNCHRONOUS_IO 阅读全文
posted @ 2013-12-30 09:35 ITtecman 阅读(857) 评论(0) 推荐(0) 编辑