1.文件描述符
对于内核而言,所有打开的文件都是通过文件描述符应用的。使用open或create返回的文件描述符标示该文件,使用read或者write时需要使用将文件描述符作为参数传入。
UNIX系统将文件描述符0与进程的标准输入关联,文件描述符1与进程的标准输出关联,文件描述符2与进程的标准错误关联。为了提高程序的可读性,应该把0,1,2替换成符号常STDIN_FILENO,STDOUT_FILENO,STDERR_FILENO 。这些常量在<unistd.h>中定义的。
2.打开文件
调用open或openat函数可以打开或创建一个文件。
#include <fcntl.h>//这两个函数的声明在fcntl.h中
int open(const char *path,int oflag,.../* mode_t mode*/);
int openat(int fd,const char *path,int oflag,.../* mode_t mode*/);
path参数是要打开或创建文件的名字。oflag是由以下一个或多个常量 进行“或”运算构成的。
O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 读写打开
O_EXEC 只执行打开
O_SEARCH 只搜索打开
这5个常量中必须制定一个且只能指定一个。下列常量可选:
O_APPEND 追加到尾端
O_CLOEXEC 把FD_CLOEXEC常量设置为文件描述符标志。
O_CREAT文件不存在则创建
O_DIRECTORY 如果path引用不是目录 则出错
.........(详见书本51页)
fd参数把open和openat区分开。有下列三种情况:
(1)path参数制定的是绝对路径名。在这种情况下,fd被忽略,两函数等价。
(2)path参数指定的是相对路径名,fd参数指定了相对路径名在文件中的开始地址。
(3)path参数指定了相对路径名,fd参数具有特殊值AT_FDCWD,在这种情况下,开始地址就是当前路径。
3.函数lseek
每个打开文件都有一个“当前文件偏移量”。打开一个文件,除非已O_APPEND的模式打开,文件的偏移量都为0。
函数原型:
#include <unistd.h>
off_t lseek(int fd,off_t offset,int whence)
文件的偏移量由offset与whence共同决定:
(1)若whence是SEEK_SET。则将该文件的偏移量设置为距文件开始处offset个字节处。
(2)若whence是SEEK_CUR。则将该文件的偏移量设置为当前偏移量加offset个字节处,offse可正可负。
(3)若whence是SEEK_END。则将该文件的偏移量设置为文件长度加offset个字节处,offse可正可负。
特别注意,lseek函数不能作用于管道,FIFO或网络套接字。
4.函数read
调用read函数从文件中读数据
#include <unistd.h>
ssize_t read(int fd,void *buf,size_t nbytes);(返回值代表实际读出数据的字节数,有可能会小于nbytes)
5.函数write
调用write函数向文件中写数据。
#include <unistd.h>
ssize_t write(int fd,const void *buf,size_t nbytes);(返回值代表实际读出数据的字节数,有可能会小于nbytes)
6.函数fcntl
函数fcntl可以改变已经打开文件的属性
#include <fcntl.h>