一起talk C栗子吧(第一百三十八回:C语言实例--文件操作:基于文件描述符一)

时间:2021-10-31 13:15:34

各位看官们,大家好,上一回中咱们说的是查看环境变量的例子,这一回咱们说的例子是:基于文件描述符的文件操作。闲话休提,言归正转。让我们一起talk C栗子吧!

看官们,我们在前面介绍进程通信的时候简单地提到过文件操作。文件操作相对进程通信来说要容易一些,因此,当时也没有做详细的介绍,不过还是有看官提到了文件操作的内容。为了大家对文件操作有更加清晰的认识,今天我将和大家一起看看文件操作相关的内容。

文件类型

在Linux系统中,一切皆文件。因此,文件操作还是还很重要的内容,Linux中的文件类型有:

  • 常规文件(-);
  • 目录文件(d);
  • 连接文件(l);
  • 设备文件(b或c);
  • 管道文件(p);
  • 套接字(socket);

我们可以通过ls -al命令来查看目录中文件的类型。上面括号中的字母表示该命令运行结果中文件类型的表示方法。我们举个例子进行说明:

ls -al /lib   //我们只截取了一部分命令运行结果,但是足以说明问题
total 684
drwxr-xr-x 24 root root 4096 28 2015 .
drwxr-xr-x 22 root root 4096 319 12:49 ..
drwxr-xr-x 2 root root 4096 1127 2014 brltty
lrwxrwxrwx 1 root root 21 21 2015 cpp -> /etc/alternatives/cpp
-rw-r--r-- 1 root root 26376 19 2014 libip4tc.so.0.1.0
lrwxrwxrwx 1 root root 17 21 2015 libip6tc.so.0 -> libip6tc.so.0.1.0
-rw-r--r-- 1 root root 26376 19 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 430 10:01 .
dr-xr-xr-x 9 tom tom 0 430 10:01 ..
lrwx------ 1 tom tom 64 430 10:01 0 -> /dev/pts/2
lrwx------ 1 tom tom 64 430 10:01 1 -> /dev/pts/2
lrwx------ 1 tom tom 64 430 10:01 2 -> /dev/pts/2
lr-x------ 1 tom tom 64 430 10:01 3 -> /proc/4012/fd //当前进程打开的文件描述符为3

从上面的运行结果中可以看到,当前进程打开的文件描述符为3,而0,1,2这三个文件描述符是系统自动打开的。

各位看官,关于文件操作:基于文件描述符的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。