【unix高级编程】1.文件描述符

linux系统可以看成是由文件组成的系统,包括所有资源,设备,硬件都可以看成是文件,linux可以对文件进行打开、读取、写入、关闭。同样可以对硬件文件进行读取,写入。比如我们要打印一个字符串到屏幕上,在Linux里面屏幕这个硬件被抽象成了一个文件,我们可以通过往那个文件里面写入字符串,来实现打印。再比如现在有一个串口,他要和其它的一个PC通过串口通信,这个串口在系统里也被抽象成了一个文件,我们可以通过从文件读来取出串口上发过来的数据,通过写入,来向另外一个PC发送数据。看下面的程序: 它就是向STDOUT_FILENO这个文件里面写入helloworld这11个字符,这个STDOUT_FILENO是什么东西呢?我们先找到它的定义再说,grep –R ’STDOU_FILENO’ /usr/include/上面的命令就是在/usr/include/这个目录及其子目录里的文件里查找含有STDOUT_FILENO这个字符串的行,找到就打印出来,我们来看结果只有在条,通过后面的注释可以看出,这个宏定义表示的是标准输出,也就是屏幕,那它为什么是1呢。我们引出了下面的术语,文件描述符(File descriotor)对于内核而言,所有打开文件都由文件描述符引用。文件描述符是一个非负整数。当打开一个现存文件或创建一个新文件时,内核向进程返回一个文件描述符。当读、写一个文件时,用open或creat返回的文件描述符标识该文件,将其作为参数传送给read或write。有三个特殊的文件描述符,每个进程在创建时,都默认打开三个文件描述符。 standard input(0), standard output(1),standard error(2)上面的STDOUT_FILENO就是标准输出文件描述符,它和我们标准C库里的文件指针很相似,只是相似,完全不一样(后面我们有例子来分析两个的不相同之处)。其实如果你分析了内核的源码后会发现,文件描述符,其实是当前程序打开文件结构数组的下标,当一个程序启动时,系统默认的让他打开了三个文件,就是标准输入,标准输出,标准错误输出,它们的在打开文件结构数据的下标就是0,1,2,因此,如果我的程序再打开一个新的文件,那么应该这个下标(文件描述符)就应该是3,下面我们证明下。#include #include int main(void){int fd;fd = open("/tmp/tmp.txt", O_RDONLY);printf("fd:%d/n", fd);return 0;}下面是执行的结果:因此我们的猜测是正确的。看下图左边的用户文件描述符表,其实就是当前程序打开的文件的一个数组,其文件描述符就是其下标。注意下标准输入,标准输出,标准错误输出这三个描述符的定义在头文件中,我们可以通过grep来找出来,具体用法见前面。文件描述符的范围是0 ~ OPEN_MAX。早期的UNIX版本采用的上限值是1 9 (允许每个进程打开2 0个文件),现在很多系统则将其增加至256。这个好理解,一个程序不可能无休止的打开文件,有个限制,这个限制每个系统可能都不太一样,要是想查看你自己系统的最大打开文件数,也就是文件描述符范围,也用grep去找一个OPEN_MAX这个字符串
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值