可参考《Linux程序设计 第四版》
什么是文件描述符(file descriptor)
每个进程(运行中的程序)都有与之关联的文件描述符. 文件描述符通常是一些小的整数,我们可以通过一个进程的文件描述符访问该进程打开的文件或这设备. 一个进程能够有多少文件描述符取决于系统的配置. 当一个程序开始运行时, 它一般有三个文件描述符:
文件描述符 | 含义 |
---|---|
0 | 标准输入 (standard input) |
1 | 标准输出 (standard output) |
2 | 标准错误 (standard error) |
文件描述符(file descriptor)这个概念可能对初次接触Linux编程的人来说,是一个比较新的概念。拿人来举例子,我们有眼睛、耳朵、皮肤等输入设备;有嘴巴、四肢等输出设备;有时候人生病了,会有一些症状,我们也可以理解其为错误输出。
在类Unix操作系统中,每个进程也有这三种类似的东西,分别是上表中的标准输入、标准输出以及标准错误。更进一步,为了方便操作系统对进程进行管理,我们给每个文件描述符都编了号,0、1、2就分别是标准输入、标准输出以及标准错误的编号。
write系统调用
简单地说,write系统调用就是一个函数,它可以将缓冲区 buf 的前 nbytes 个字节写入与文件描述符相关联的文件中,它返回实际写入的字节数。其原型如下:
#include <unistd.h>
size_t write(int fildes, const void *buf, size_t nbytes);
下面的程序,可以对这个命令行程序本生进行写操作:
#include <unistd.h>
#include <stdio.h>
int main()
{
if(write(1, "Here is some data\n", 18) != 18)
write(2, "A write error has occurred on file descriptor 1\n", 46);
return 0;
}
上面这段程序很简单,我们运行它的时候,它就是当前的进程,该程序的 if 语句将字符串 “Here is some data\n” 写入了自己的1号文件描述符,也就是标准输出。
因为它是命令行程序,所以标准输入是命令行的输入流,标准输出是命令行的输出流,所以当运行这个程序的时候,命令行会显示一个字符串 “Here is some data\n”。
下面是编译以及运行的结果:
$ gcc -o simple_write simple_write.c # compile
$ ./simple_write # run
Here is some data # standard output
$
所以,文件描述符无非就是一些与当前进程相关的文件的数值表示(就好像一个班级里每个学生都有学号一样,能够方便地管理学生),我们可以方便地使用文件描述符进行各种操作。