【发布时间】:2017-07-17 21:48:34
【问题描述】:
read(2) 和 write(2) 既适用于套接字描述符,也适用于文件描述符。在文件描述符的情况下,用户文件描述符表->文件表,最后到 inode 表,它检查文件类型(常规文件/字符/块),并相应地读取。如果是 char spl 文件,它会根据文件的主设备号从 char 设备开关获取函数指针,并调用为设备注册的适当读/写例程。 类似地,通过从块设备开关获取函数指针,为块特殊文件调用适当的读/写例程。
能否请您告诉我在套接字描述符上调用读/写时会发生什么。如果对socket描述符进行读/写,我们不能用open代替socket来获取描述符吗?
【问题讨论】:
-
无法确切地告诉您会发生什么(如果您真的想知道,请尝试查看内核源代码),但本质上它会将请求传递给 TCP 驱动程序,它将进一步向下传递网络堆栈,直到它到达网络接口卡的驱动程序。如果您想了解网络堆栈的每一层的一般用途,请查看 OSI 模型。至于
open和socket:它们采用不同的参数,因为需要指定的信息根据您是要打开文件还是要打开套接字而有所不同。 -
我想知道调用 socket() 时分配的数据结构是什么,inode 表中存储了哪些信息,在调用 read/write 时它最终如何到达网络接口卡驱动程序
-
注意读/写包装系统调用。大部分工作在内核空间中完成。这是一种抽象,或“虚拟化”:只需将块文件、套接字或许多其他东西作为“文件”。文件具有读、写、打开等操作。但是读取套接字或读取磁盘文件的真正实现是在内核中定义的。如果需要,您甚至可以定义从文件中读取的“写入”。
标签: linux