套接字描述符与文件描述符

时间:2010-08-13 08:38:11

标签: linux

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

请你告诉我在套接字描述符上调用read / write时会发生什么。如果读取/写入对套接字描述符起作用,我们不能使用open而不是socket来获取描述符吗?

3 个答案:

答案 0 :(得分:10)

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

简而言之,内核做了:

  1. 在read-write.c中,有一个file_system_wrapper函数,调用相应的处理函数取决于fd的文件类型(ext2 / ext3 / socket / ..)
  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时会调用此函数。
  5. 希望这清楚, 谢谢, 后城

答案 1 :(得分:3)

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

答案 2 :(得分:0)

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

原则上,open()可以创建套接字描述符,但BSD套接字API从未以这种方式定义。

还有一些其他(Somewhat linux-specific)类型的文件描述符由open()以外的系统调用打开,例如epoll_create或timerfd_create。这些都是一样的。