一起talk C栗子吧(第一百三十八回:C语言实例--文件操作:基于文件描述符一)
各位看官们,大家好,上一回中咱们说的是查看环境变量的例子,这一回咱们说的例子是:基于文件描述符的文件操作。闲话休提,言归正转。让我们一起talk c栗子吧!
看官们,我们在前面介绍进程通信的时候简单地提到过文件操作。文件操作相对进程通信来说要容易一些,因此,当时也没有做详细的介绍,不过还是有看官提到了文件操作的内容。为了大家对文件操作有更加清晰的认识,今天我将和大家一起看看文件操作相关的内容。
文件类型
在linux中,一切皆文件。因此,文件操作还是还很重要的内容,linux中的文件类型有:
常规文件(-); 目录文件(d); 连接文件(l); 设备文件(b或c); 管道文件(p); 套接字(socket);我们可以通过ls -al命令来查看目录中文件的类型。上面括号中的字母表示该命令运行结果中文件类型的表示方法。我们举个例子进行说明:
ls -al /lib //我们只截取了一部分命令运行结果,但是足以说明问题 total 684 drwxr-xr-x 24 root root 4096 2月 8 2015 . drwxr-xr-x 22 root root 4096 3月 19 12:49 .. drwxr-xr-x 2 root root 4096 11月 27 2014 brltty lrwxrwxrwx 1 root root 21 2月 1 2015 cpp -> /etc/alternatives/cpp -rw-r--r-- 1 root root 26376 1月 9 2014 libip4tc.so.0.1.0 lrwxrwxrwx 1 root root 17 2月 1 2015 libip6tc.so.0 -> libip6tc.so.0.1.0 -rw-r--r-- 1 root root 26376 1月 9 2014 libip6tc.so.0.1.0
该结果第一列的第一个字母就是文件类型,比如d表示该文件是目录文件,l表示该文件是链接文件,-表示该文件是常规文件。该目录中没有其它文件类型的文件,我们也就不说了,相信大家在遇到的这类文件的时候也能明白它们的文件类型。今天我们介绍的文件操作,可以用于设备文件以外的其它文件。
文件描述符
明白文件类型后, 我们介绍一下文件描述符。文件描述符由系统提供,系统提供的api接口通过它来操作文件。它通常一个非负整数,而且由系统分配和回收,分配时从最小的数值开始依次增大,文件操作完成后需要手动关闭文件,其实就是告诉系统去回收文件操作符,以便下次再使用,因此文件操作符是一个环保产品,可以循环利用。
文件操作符的值是唯一的,即使操作同一个文件也会有不同的文件操作符。文件操作符的值也不是无究大,它有一个最大值,也就是程序能够同时打开最多的文件数量,这个值与具体的系统有关,posix标准只规定了最小值为16,在linux中它的默认值为256.不过这个值会随着系统运行的情况动态变化。
系统默认使用了前三个文件描述符:0,12。它们分别表示标准输入,标准输出和标准错误。这三个文件描述符比较特殊,每个进程启动时都会自动打开这三个文件操作符,在进程结束时又会自动关闭它们。也就是说它们是由系统进行管理的,我们只管使用就行,其它的事情交给系统去处理。我们举个例子来说明:
ls -al /dev/fd/ //我们使用ls命令查看当前进程打开的文件描述符 total 0 dr-x------ 2 tom tom 0 4月 30 10:01 . dr-xr-xr-x 9 tom tom 0 4月 30 10:01 .. lrwx------ 1 tom tom 64 4月 30 10:01 0 -> /dev/pts/2 lrwx------ 1 tom tom 64 4月 30 10:01 1 -> /dev/pts/2 lrwx------ 1 tom tom 64 4月 30 10:01 2 -> /dev/pts/2 lr-x------ 1 tom tom 64 4月 30 10:01 3 -> /proc/4012/fd //当前进程打开的文件描述符为3
从上面的运行结果中可以看到,当前进程打开的文件描述符为3,而0,1,2这三个文件描述符是系统自动打开的。
各位看官,关于文件操作:基于文件描述符的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。
推荐阅读
-
一起talk C栗子吧( 第一百四十回:C语言实例--文件操作:基于文件描述符三)
-
一起talk C栗子吧(第一百四十三回:C语言实例--文件操作:基于文件指针三)
-
一起talk C栗子吧(第一百三十九回:C语言实例--文件操作:基于文件描述符二)
-
一起talk C栗子吧(第一百三十八回:C语言实例--文件操作:基于文件描述符一)
-
一起talk C栗子吧(第一百四十一回:C语言实例--文件操作:基于文件指针一)
-
一起talk C栗子吧(第一百四十二回:C语言实例--文件操作:基于文件指针二)
-
一起talk C栗子吧(第一百五十八回:C语言实例--基于AF_INET域的流套接字通信)
-
一起talk C栗子吧(第一百五十九回:C语言实例--基于AF_INET域的数据报套接字通信)
-
一起talk C栗子吧(第一百三十九回:C语言实例--文件操作:基于文件描述符二)
-
一起talk C栗子吧(第一百三十八回:C语言实例--文件操作:基于文件描述符一)