2010-08-13 288 views
9

read(2)和write(2)既适用于套接字描述符也适用于文件描述符。在文件描述符,用户文件描述符表 - >文件表的情况下,最后到它检查文件类型(常规文件/字符/块)的inode表中,并相应地读取。在char spl文件的情况下,它会根据char设备开关中的文件主编号获取函数指针,并调用为该设备注册的相应读/写例程。 通过获取块设备开关中的函数指针,为块特殊文件调用类似适当的读/写例程。套接字描述符与文件描述符

请让我知道当在套接字描述符上调用read/write时会发生什么。如果读/写在套接字描述符上工作,我们不能使用open而不是套接字来获取描述符?

+0

不能告诉你确切** **发生了什么(试着看内核源代码,如果你真的想知道),但本质上它会通过该请求将传递给TCP驱动程序,该驱动程序会将其传递到网络堆栈的下方,直到它到达网络接口卡的驱动程序。如果您想知道网络堆栈的每个层面通常会做什么,请查看* OSI模型*。至于'open'和'socket':它们有不同的参数,因为需要指定的信息因打开文件或套接字而不同。 – David 2010-08-13 08:53:36

+0

我想知道在调用socket()时分配的数据结构是什么,在inode表中存储了什么信息,它在调用读/写时如何最终到达网络接口卡驱动程序例程 – 2010-08-13 10:02:52

+0

说明read/write包装系统调用。大部分工作都是在内核空间完成的。 这是一种抽象,或“虚拟化”:只需将块文件,套接字或许多其他内容作为“文件”。一个文件具有读,写,打开等操作。但是在内核中定义读取套接字或读取磁盘文件的真正实现。如果需要,甚至可以定义从文件中读取的“写入”。 – tristan 2010-08-24 14:00:02

回答

2

套接字描述符也与文件结构相关联,但是该结构的一组file_operations函数与通常的不同。这些描述符的初始化和使用因此是不同的。读取和写入内核级接口的一部分恰好相当。

+0

我想知道在调用socket()时分配的数据结构是什么,inode表中存储了什么信息,它如何最终到达网络接口卡驱动程序例程调用读/写 – 2010-08-13 09:31:40

+0

没有发生,而是故意使其相同 – Yerken 2016-12-19 23:48:11

0

读取和写入对于某些状态的某些类型的套接字有效;这一切都取决于在内核中传递的各种结构。

原则上,open()可以创建一个套接字描述符,但是BSD套接字API从来没有这样定义过。

还有一些其他的(有点linux特定的)类型的文件描述符,它们是由open()以外的系统调用打开的,例如epoll_create或timerfd_create。这些工作是一样的。

6

正如我在内存中知道的那样,文件描述符将包含标志来标识此fd的文件系统类型。内核将根据文件系统类型调用相应的处理函数。你可以在linux内核中看到源码read_write.c。

要在简短的发言中,内核所做的:

  1. 在读为write.c,有一个file_system_wrapper功能,即调用相应的处理函数依赖于FD的文件类型(EXT2/EXT3 /插座/ ..)
  2. 在socket.c中,有一个socket_type_wrapper函数;调用相应的套接字处理函数取决于套接字的类型(ipv4,ipv6,atm others)
  3. 在socket_ipv4.c中,有一个protocol_type包装函数;即调用相应协议处理函数取决于协议tpye(udp/tcp)
  4. 在tcp_ip4.c;有tcp_sendmsg,并且在写入tcp ipv4类型的FD时会调用此函数。

希望这清楚了, 感谢, 后城