3.1 引言
Unix系统中的大多数文件I/O只需用到5个函数
- open
- read
- write
- lseek
- close
不带缓冲的I/O 指的是每个read和write都调用内核中的一个系统调用。
3.2 文件描述符
所有打开的文件都通过文件描述符引用。文件描述符是一个非负整数。
Unix系统shell以及很多应用程序的惯例:
- 0–标准输入–STDIN_FILENO
- 1–标准输出–STDOUT_FILENO
- 2–标准错误–STDERR_FILENO
3.3函数open和openat
#include <fcntl.h>
int open(const char *path,int oflag,.../*mode_t* mode/);
int open(int fd,const char *path,int oflag,.../*mode_t* mode/);
由open和openat函数返回的文件描述符一定是最小的未用描述符数值。
3.4 函数create
#include <fcntl.h>
int create(const char *path,mode_t mode);
该函数与
open(path,O_WRONLY|O_CREATE|O_TRUNC,mode);
等效。
3.5 函数close
#include <unistd.h>
int close(int fd)
关闭一个文件时会释放该进程加在文件上的所有记录锁。
进程终止时,内核自动关闭它所有的打开文件。
3.6 函数lseek
#include <unistd.h>
off_t lseek(int fd,off_t offset,int whence);
对示例中第二个调用的解释:
$ cat < /etc/passwd | ./ a.out
cannot seek
代码中的|
是Unix系统中的管道符号,表示把一个程序的输出作为标准输入传递给另一个程序。由于传入a.out的是一个管道,所以lseek返回-1。