UNIX中的一切事物都是文件(everything in Unix is a file!)

当我在这篇教程中提到UNIX的时候,其意思专指符合UNIX标准的所谓“正统”UNIX的衍生系统(其实我就用来带指那些买了最初UNIX源代码的商业系统)操作系统和类似Linux,BSD这些类UNIX系统。如果某些要点是Linux特有的,或者因为本人孤陋寡闻暂时搞不清楚是Linux特有的还是UNIX通用的,我就会指明是Linux,甚至其发行版(我本人在写这篇教程的时候是以Debian GNU/Linux 4.0 etch为测试平台的)。

我们学习UNIX的时候,恐怕听到的第一句话就是这句:UNIX中一切都是文件。这是UNIX的基本理念之一,也是一句很好的概括。比如,很多UNIX老鸟会举出个例子来,“你看,/dev/hdc是个文件,它实际上也是我的光盘……”UNIX中的文件可以是:网络连接(network connection),输入输出(FIFO),管道(a pipe),终端(terminal),硬盘上的实际文件,或者其它任何东东。

文件与文件描述符(file & file descriptor)

你可能对上一章中建模类中的int还记忆犹新。我们用int在描述socket,实际上,所有的文件描述符都是int,没错,用的是一个整数类型。如果你觉得这样让你很难接受,那么恭喜你,你跟我一样,也许是深中C++面向对象思想的毒了^^。因为是int,所以文件描述符不可能是C++概念中的对象,因为int无法发出行为,但是,这并不代表也不能接受一个动作哈。

PASCAL之父在批判面向对象思想教条的时候,曾经生动的举了个例子,“在OOP的概念中,绝对不应该接受a+b这种表达的, OOP对这个问题的表达应该是a.add(b)”。fd(file descriptor)可以作为接受动作的对象,但是本身却无法发出动作,这就如同一个只能做宾语不能做主语的名词,是个不完整的对象。但是,请别忘了Linux和socket本身是C语言的产物,我们必须接受在面向过程时代下的产物,正视历史——当然,这与我们自己再进行OOP的封装并不矛盾。

我们应该记住3个已经打开的fd,0:标准输入(STDIN_FILENO);1:标准输出(STDOUT_FILENO);2:标准错误(STDERR_FILENO)。(以上宏定义在<unistd.h>中)一个最简单的使用fd的例子,就是使用<unistd.h>中的函数:write(1, "Hello, World!\n", 20);,在标准输出上显示“Hello, World!”。

另外一个需要注意的问题是,file和fd并非一定是一一对应的。当一个file被多个程序调用的时候,会生成相互独立的fd。这个概念可以类比于C++中的引用(eg: int& rTmp = tmp;)。

socket与file descriptor

文件是应用程序与系统(包括特定硬件设备)之间的桥梁,而文件描述符就是应用程序使用这个“桥梁”的接口。在需要的时候,应用程序会向系统申请一个文件,然后将文件的描述符返回供程序使用。返回socket的文件通常被创建在/tmp或者/usr/tmp中。我们实际上不用关心这些文件,仅仅能够利用返回的socket描述符就可以了。

好了,说了这么多,实际上就解释了一个问题,“为什么socket的类型是int?” -_-!!!

TCP/UDP网络编程入门教程之二:TCP Server端——socket与文件描述符相关推荐

  1. TCP/UDP(网络编程)

    TCP/UDP(大作业) 文章目录 TCP/UDP(大作业) Java 网络编程 1.1.描述TCP协议和UDP协议,并说出他们的区别与联系: 基于客户机-服务器模式的应用场景 2.什么是客户机-服务 ...

  2. TCP/IP网络编程---Linux系统下的TCP套接字编程

    目录 第一章 理解网络编程和套接字 1.1 网络编程和套接字概要 1.2 基于Linux的文件操作 1.2.1 底层文件访问和文件描述符 1.2.2 打开文件 1.2.3 关闭文件 1.2.4 将数据 ...

  3. socket 编程入门教程(一)TCP server 端:2、socket与文件描述符

    UNIX中的一切事物都是文件( everything in Unix is a file!) 当我在这篇教程中提到UNIX的时候,其意思专指符合UNIX标准的所谓"正统"UNIX的 ...

  4. TCP/UDP网络编程

    目录 一.常见的客户端服务端模型 二.Socket套接字 1.概念 2.分类 a.流套接字 b.数据报套接字 c.原始套接字 三.UDP数据报套接字编程 四.TCP数据报套接字编程 一.常见的客户端服 ...

  5. Java的TCP/UDP网络编程+多线程实现服务器端与客户端间的通信

    写在前面: Java为网络编程提供了丰富的库,我们能通过调用Socket套接字的方法实现服务器与客户端的双通信. 注意点: 需要注意的是端口的对应,端口可以理解为窗户,服务器只能通过某个端口(窗户)与 ...

  6. ubuntu安装pr_[原创]Dapr入门教程之二:Dapr的安装

    安装Dapr的CLI 在安装Dapr runtime之前需要先安装Dapr的CLI.有两个原因,第一,如果你以后不是用Helm来安装Dapr的话,需要用Dapr CLI来执行dapr init.即使你 ...

  7. TCP/UDP 网络编程实例

      TCP服务器: TCP_Server.c #include<stdio.h> #include <stdlib.h> #include <errno.h> #i ...

  8. github打开前端样式丢失_微信小程序入门教程之二:页面样式

    这个系列的上一篇教程,教大家写了一个最简单的 Hello world 微信小程序. 但是,那只是一个裸页面,并不好看.今天接着往下讲,如何为这个页面添加样式,使它看上去更美观,教大家写出实际可以使用的 ...

  9. image 微信小程序flex_微信小程序入门教程之二:页面样式

    这个系列的上一篇教程,教大家写了一个最简单的 Hello world 微信小程序. 但是,那只是一个裸页面,并不好看.今天接着往下讲,如何为这个页面添加样式,使它看上去更美观,教大家写出实际可以使用的 ...

最新文章

  1. freeglut中提供的几种立体几何对象绘制的android移植
  2. 深入理解javascript原型和闭包(6)——继承
  3. 车小米O2O保养平台搭建完毕
  4. Android开发之快捷键Google官方版本包含Mac版本
  5. OpenMP之双重for循环并行计算改进
  6. JavaScript中不得不说的断言?
  7. C#命名空间namespace中不能直接包含字段(变量)或方法(函数)之类的成员
  8. Nodejs 中的包、npm 、第三方模块、 package.json 以及 cnpm
  9. 【API进阶之路】用API打造一条自动化内容生产流水线
  10. SylixOS SylixOS CAN总线驱动之三
  11. 远程主机强迫关闭了一个现有的连接。_紧急 | 微软远程桌面服务高危漏洞(CVE-2019-0708)预警!...
  12. 在线抢购平台_项目预览
  13. Android 使用百度云文字识别之实现通用文字识别
  14. 在React中使用Shadow DOM
  15. 尚医通(二十四)微信退款(取消预约功能)
  16. 社会生活中的十二条著名法则
  17. 3D进阶之OSG:从VS2019编译osgEarth开始
  18. 荔枝派Zero小白(一)
  19. java对一些文件格式的操作(读写)
  20. 华为云计算IE面试笔记-桌面云用户登录连接流程及故障处理

热门文章

  1. java基本类型的包装类型_有了基本数据类型,为什么还需要包装类型
  2. 10投屏后没有声音_手机投屏到电视没有声音?
  3. php5.4开启opcache,windows下php5.6启用opcache
  4. mysql timestamp 自动更新_mysql timestamp自动更新
  5. 深度探索linux系统虚拟化 原理与实现,深度探索Linux系统虚拟化:原理与实现
  6. json文件转为excel_2分钟上手、3小时学会无代码软件开发---XML、Json处理
  7. 西安理工大学 计算机考研不分专硕学硕吗,2021年西安理工大学计算机科学与工程学院考研专业目录_研究生考试范围 - 学途吧...
  8. 学习STM32很简单?
  9. 牛人自制电灯泡,20000W,结果“亮”了
  10. 来了,单片机最强科普总结!