文档介绍:低级文件I/O
系统调用
open( ) read( ) write( )
lseek( ) dup( ) dup2()
fcntl( ) lockf( ) flock( )
ioctl( ) close( )
文件描述
当打开一个现存文件或创建一个新文件时,内核向进程返回一个文件描述符。当读、写一个文件时,用open或creat返回的文件描述符标识该文件,将其作为参数传送给read、write、lseek和close等。
按照惯例,UNIX shell使文件描述符:
0-stdin 1-stdout 2-stderr
,标准I/O描述符被定义为:
0-STDIN_FILENO; 1-STDOUT_FILENO; 2-STDERR_ FILENO
这些常数都定义在头文件<>中。
文件描述符的范围是0 ~ OPEN_MAX。早期的UNIX版本采用的上限值是1 9 (即2 0),现在很多系统则将其增加至256且可以以内核参数的办法设置,比方说1024。
原始系统数据类型
在UNIX/Linux的开发过程中用到的以_t结尾的数据为系统原始数据。
系统原始数据在头文件<sys/>中被定义。
出错处理
UNIX函数出错时,往常返回一个负值,而且整型变量errno通常设置为具有特定信息的一个值。例如,open函数如成功执行则返回一个非负文件描述符,如出错则返回-1。
在open出错时,有大约1 5种不同的errno值。
某些函数并不返回负值而是使用另一种约定。例如,返回一个指向对象的指针的大多数函数,在出错时,将返回一个null指针(NULL)。
文件< >中定义了变量errno以及可以赋与它的各种常数。这些常数都以E开头。
在Linux系统中,errno定义在头文件/usr/include/asm/,多达124条。
errno
POSIX定义errno为:extern int errno;
对于errno应当知道两条规则:
1:如果没有出错,则其值不会被一个例程清除。因此,仅当函数的返回值指明出错时,才检验其值。
2:任一函数都不会将errno值设置为0,在<>中定义的所有常数都不为0。
错误处理的标准函数
strerror( ):
功能:以字符串方式打印错误信息。
用法:
#include <>
char *strerror(int errnum);
返回:指向消息字符串的指针。
perror()
功能:在标准错误上产生一条基于其参数串和errno的当前值出错消息。
用法:
#include <>
void perror(const char * msg);
输出:首先输出由msg指向的字符串,然后是一个冒号,一个空格,然后是对应于errno值的出错信息,然后是一个新行符。
处理错误的示例1
#include <>
#include <>
main(int argc, char *argv[ ]) {
fprintf(stderr,"ES=%d: %s\n",ES, strerror(ES));
errno=ENOENT;
perror(argv[0]);
}
结果:假设,,则输出为:
ES=13: Permission denied
./: No such file or directory
处理错误的示例2
#include <>
#include <>
main(int argc, char *argv[ ])
{
int i, fd;
for(i=1; i< argc; i++){ if((fd=open(argv[i],O_RDWR))==-1) perror(argv[i]);
else close(fd);
}
}
open
功能:
打开或创建一个文件,并返回一个文件描述符。
用方:
#include <sys/>
#include <sys/>
#include <>
int open(const char *name, int oflag) ;
int open(const char *ame, int oflag, mode_t mode ) ;
返回值:
成功时为文件描述符,出错则为-1。
出错时errno被设置。