在Linux编程时,无论是在操作文件还是网络操作时都能够通过文件描述符来read或者write。
Linux这一套文件机制就相当于面向对象里面的多态,拿到一个文件描述符都可以进行read或者write。但是具体的read和write却跟对应文件描述符的具体实现不同。比如socket的就是走网络,常用skfd表示文件描述符,普通文件的就是走磁盘IO,常用fd表示文件描述符。
下面一张UML类图大概表现出了Linux文件描述符的大概意思:
当然,为了将不同的类型的I/O与对应的文件描述符绑定,则是需要不同的初始化函数的。在C++中有构造函数跟编译器帮助搞定,在C函数里只能自己动手丰衣足食了。
普通文件就通过open函数,指定对应的文件路径,操作系统通过路径能够找到对应的文件系统类型,如ext4啊,fat啊等等。
如果是网络呢,就通过socket函数来初始化,socket函数就通过(domain, type, protocol)来找到对应的网络协议栈,比如TCP/IP,UNIX等等。
整个Linux 文件系统的结构差不多就这个意思,socket跟他绑定也是为了统一接口。
所以网络相关的调用,如connect, bind等等,第一步基本上就是通过文件描述符找到对应的内核socket结构,然后在进行对应的操作。