read(2)和write(2)在套接字描述符和文件描述符上都有效。在文件描述符的情况下,用户文件描述符表 - >文件表,最后到inode表,它检查文件类型(常规文件/ char / block),并相应地读取。在char spl文件的情况下,它根据来自char设备开关的文件的主要编号获取函数指针,并调用为该设备注册的相应读/写例程。 类似地,通过从块设备开关获取函数指针,可以为块特殊文件调用适当的读/写例程。
请你告诉我在套接字描述符上调用read / write时会发生什么。如果读取/写入对套接字描述符起作用,我们不能使用open而不是socket来获取描述符吗?
答案 0 :(得分:10)
正如我在内存中所知,文件描述符将包含用于标识此fd的文件系统类型的标志。内核将根据文件系统类型调用相应的处理函数。你可以在linux内核中看到源read_write.c。
简而言之,内核做了:
希望这清楚, 谢谢, 后城
答案 1 :(得分:3)
套接字描述符也与文件结构相关联,但是该结构的一组file_operations函数与通常不同。因此,这些描述符的初始化和使用是不同的。读取和写入部分内核级接口恰好完全等效。
答案 2 :(得分:0)
读取和写入对某些状态的某些类型的套接字有效;这一切都取决于在内核中传递的各种结构。
原则上,open()可以创建套接字描述符,但BSD套接字API从未以这种方式定义。
还有一些其他(Somewhat linux-specific)类型的文件描述符由open()以外的系统调用打开,例如epoll_create或timerfd_create。这些都是一样的。