基本知识:

对于内核而言,所有打开的文件都通过文件描述符引用。例如对于Linux应用程序员来讲,音频编程接口实际上就是一组音频设备文件,通过它们可以从声卡读取数据,或者向声卡写入数据,并且能够对声卡进行控制,设置采样频率和声道数目等等。

当读或写一个文件时,使用open或create返回的文件描述符标识该文件,将其作为参数传送给read或write。

UNIX系统shell使用文件描述符0与进程的标准输入相关联,文件描述符1与标准输出相关联,文件描述符2与标准出错相关联。在依从POSIX的应用程序中,幻数0,1,2应当替换成常量

/* Standard file descriptors. */

#define STDIN_FILENO 0 /* Standard input. */

#define STDOUT_FILENO 1 /* Standard output. */

#define STDERR_FILENO 2 /* Standard error output. */

//defined in /usr/include/unistd.h。

1. open, creat - 用来 打开和创建 一个 文件或设备

描述:

int open(const char *pathname, int flags);

int open(const char *pathname, int flags, mode_t mode)

int creat(const char *pathname, mode_t mode);

open() 通常 用于 将 路径名 转换为 一个 文件描述符 (一个 非负的 小 整数, 在 read , write 等 I/O操作中 将会被使用). 当 open() 调用 成功, 它会 返回 一个 新的 文件描述符 (永远取 未用 描述符的 最小值). 这个调用 创建 一个 新的 打开文件, 即 分配 一个 新的 独一无 二的 文件描述符, 不会与 运行中的 任何 其他程序 共享 (但 可以 通过 fork (2) 系统调用 实现 共享). 这个 新的 文件描述符 在其后 对 打开文件操作 的函数 中 使用.(参考 fcntl(2)). 文件的 读写 指针 被 置于 文件头参数 flags 是通过 O_RDONLY, O_WRONLY 或 O_RDWR (指明 文件 是以 只读 , 只写 或 读写 方式 打开的) 与 下面的 零个

或 多个 可选模式 按位 -or 操作 得到的(模式很多,就不贴了,直接man看下即可,以上描述也是从man 2 open里复制的)。

create函数等效于 open(pathname, O_WRONLY | O_CREAT | O_TRUNC, mode);

两个函数在<fcntl.h>都可以找到函数声明。

2. close函数用来关闭一个文件

描述:

#include <unistd.h>

int close(int fd);

当一个进程终止时,内核自动关闭它所有打开的文件。很多程序利用了这一功能而不显式的用close关闭打开文件。

3. lseek:设置文件偏移量

描述:

每个打开的文件都有一个与其相关联的“当前文件偏移量”(current file offset)。它通常是一个非负整数,用以度量从文件开始处计算的字节数。通常,读、写操作都从文件偏移量处开始,打开一个文件时,除非指定O_APPEND,否则该偏移量设置为0.

#include<unistd.h>

off_t lseek(int fileds, off_t offset, int whence);

SEEK_SET

The offset is set to offset bytes.

SEEK_CUR

The offset is set to its current location plus offset bytes.

SEEK_END

The offset is set to the size of the file plus offset bytes.

可以用下列方式确定打开文件的当前偏移量:

off_t currpos = lseek(fd, 0, SEEK_CUR);

这种方法也可以用来确定所涉及的文件是否可以设置偏移量。如果文件描述符引用的是一个管道、FIFO或网络套接字,则lseek返回-1,并将errno设置为ESPIPE。

lseek仅将当前的文件偏移量记录在内核中,它并不引起任何IO操作。然后,该偏移量用于下一个读写操作。

4. read:从打开文件中读数据

描述:

ssize_t read(int fd, void *buf, size_t count);

成功返回读到的字节数,若已到文件结尾则返回0,若出错则返回-1.

5. write:向打开的文件写入数据。

ssize_t write(int fd, const void *buf, size_t count);

代码示例:

从标准输入读取,写到标准输出:

#include <unistd.h> 

#include <stdio.h>

#include <stdlib.h>

const int BUFFSIZE = 4096;

int main()

{

int n;

char buf[BUFFSIZE];

while ((n=read(STDIN_FILENO, buf, BUFFSIZE)) > 0)

if (write(STDOUT_FILENO, buf, n) != n) {

printf("write error\n");

exit(1);

}

if (n < 0) {

printf("read error\n");

exit(1);

}

exit(0);

}