1、文件描述符 在POSIX.1应用程序中,幻数0、1、2应被代换成符号常数S T D I N _ F I L E N O、S T D O U T _F I L E N O和S T D E R R _ F I L E N O。这些常数都定义在头文件中。 文件描述符的范围是0 ~ OPEN_MAX 。早期的U N I X版本采用的上限值是19 (允许每个进程打开2 0个文件),现在很多系统则将其增加至63。 2、open函数 #include #include #include int open(const char *pthname,flags,int perms); pathname是要打开或创建的文件的名字。flags参数可用来说明此函数的多个选择项。用下列一个或多个常数进行或运算构成flags参数(这些常数定义在头文件中): •O_RDONLY 只读打开。 •O_WRONLY 只写打开。 •O_RDWR 读、写打开。 很多实现将O_RDONLY定义为0,O_WRONLY定义为1,O_RDWR定义为2,以与早期的系统兼容。 在这三个常数中应当只指定一个。下列常数则是可选择的: •O_APPEND 每次写时都加到文件的尾端。 •O_CREAT 若此文件不存在则创建它。使用此选择项时,需同时说明第三个参数perms,用其说明该新文件的存取许可权位。 •O_EXCL 如果同时指定了O_CREAT,而文件已经存在,则出错。这可测试一个文件是否存在,如果不存在则创建此文件成为一个原子操作。 •O_TRUNC 如果此文件存在,而且为只读或只写成功打开,则将其长度截短为0。 •O_NOCTTY 如果pathname指的是终端设备,则不将此设备分配作为此进程的控制终端。 •O_NONBLOCK如果pathname指的是一个FIFO、一个块特殊文件或一个字符特殊文件,则此选择项为此文件的本次打开操作和后续的I/O操作设置非阻塞方式。 • O_SYNC使每次write都等到物理I/O操作完成。 3、close函数 可用close函数关闭一个打开文件: #include int close(int fd); fd:文件描述符。 返回:若成功为0,若出错为-1。 4、read函数 #include ssize_t read(int fd, void *buf, size_t nbytes); 返回:读到的字节数,若已到文件尾为0,若出错为-1 有多种情况可使实际读到的字节数少于要求读字节数: • 读普通文件时,在读到要求字节数之前已到达了文件尾端。例如,若在到达文件尾端之前还有30个字节,而要求读100个字节,则read返回30,下一次再调用r ead时,它将返回0(文件尾端)。 • 当从终端设备读时,通常一次最多读一行。 • 当从网络读时,网络中的缓冲机构可能造成返回值小于所要求读的字节数。 • 某些面向记录的设备,例如磁带,一次最多返回一个记录。 读操作从文件的当前位移量处开始,在成功返回之前,该位移量增加实际读得的字节数。 POSIX.1在几个方面对此函数的原型作了更改。其经典定义是: int read(int fd, char *buf, unsigned nbytes);首先,为了与ANSI C一致,其第二个参数由char *改为void *。在ANSI C中,类型void *用于表示类属指针。其次,其返回值必须是一个带符号整数( ssize _ t),以返回正字节数、0(表示文件尾端)或- 1(出错)。最后,第三个参数在历史上是一个不带符号整数,以允许一个1 6位的实现可以一次读或写至65534个字节。在1990 POSIX.1标准中,引进了新的基本系统数据类型ssize_t 以提供带符号的返回值, size_t则被用于第三个参数。 5、write函数 #include ssize_t write(int fd, const void *buf, size_t nbytes); 返回:若成功为已写的字节数,若出错为-1。 6、lseek函数 每个打开文件都有一个与其相关联的“当前文件位移量”。它是一个非负整数,用以度量从文件开始处计算的字节数。通常,读、写操作都从当前文件位移量处开始,并使位移量增加所读或写的字节数。按系统默认,当打开一个文件时,除非指定O _APPEND选择项,否则该位移量被设置为0。 可以调用lseek显式地定位一个打开文件。 #include #include off_t lseek(int fds, off_t offset, int whence) ; 返回:若成功为新的文件位移,若出错为- 1 对参数offset的解释与参数whence的值有关。 • 若w h e n c e是SEEK_SET,则将该文件的位移量设置为距文件开始处offset个字节。 • 若whence是SEEK_CUR,则将该文件的位移量设置为其当前值加offset, offset可为正或负。 • 若whence是SEEK_END,则将该文件的位移量设置为文件长度加offset, offset可为正或负。 若lseek成功执行,则返回新的文件位移量,为此可以用下列方式确定一个打开文件的当前位移量: off_t currpos; currpos = lseek(fd, 0, SEEK_CUR); 这种方法也可用来确定所涉及的文件是否可以设置位移量。如果文件描述符引用的是一个管道或FIFO,则lseek返回-1,并将errno设置为EPIPE。