Linux系统一切皆文件(目录、字符设备、块设备、 套接字、打印机等)屏蔽了硬件的区别,所有设备都抽象成文件,提供统一的接口给用户。这就是“一切皆是文件”的思想,因此文件描述符也非常重要。
文件描述符是个最小的正整数,它是一个索引值,指向内核为每个进程所维护的该进程打开文件的记录表。每个进程启动时候都打开三个文件:1.标准输入文件(stdin)2.标准输出(stdout)3.标准出错(stderr)这三个文件分别对应的文件描述符为0、1、2,文件描述符总是从小到大使用,如果你再打开一个文件或者设备则其描述符为3。
编程中应该使用中定义的STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO
这个可以做如下测试:写一个简单程序
/*
* file_descriptor.c
*
* Created on: 2015-1-20
* Author: hsc
*/
#include
#include
#include
int main(void)
{
while(1)
{
sleep(10);
}
return EXIT_SUCCESS;
}Makefile文件
.SUFFIXES:.c .o
CC = gcc
SRCS = file_descriptor.c
OBJS = $(SRCS:.c=.o)
EXEC = file_descriptor
start:$(OBJS)
$(CC) -g -o $(EXEC) $(OBJS)
.c.o:
$(CC) -Wall -g -o $@ -c $<
clean:
rm -f $(OBJS)
进入程序的目录后make一下会编译生成file_descriptor可执行文件
./file_descriptor
执行这个程序。
重新开启一个终端。(我这里使用putty登录的)
执行这个命令ps -aux | grep "file_descriptor" | grep -v"grep"
这个命令查找执行的程序./file_descriptor的进程信息。
可以看到./file_descriptor的进程号为14977(你的可能不是这个数,视具体而定),这里我们可以查看/proc
目录下有个14997的目录(这里包含进程相关信息)
执行cd /proc/14977
执行cd fd命令我们可以看到fd目录有三个文件0、1、2(这也就是我们所说的文件描述符)