最近我在学习libev,发现在io_watcher
中有一个可读/可写的概念,但我并不太理解。据我所知,在Linux系统编程中有一个参数:
O_ASYNC
当指定的文件变得可读或可写时,将生成一个信号(默认为SIGIO)。此标志仅适用于终端和套接字,而不适用于常规文件。
因此,由于常规文件不会受到可读/可写的影响,那么在套接字编程中,可读/可写实际上是什么意思?内核是如何确定套接字文件描述符是否可读的呢?
考虑到“一切皆文件”的哲学,每个具有不同描述符编号的套接字描述符实际上指向同一个文件吗?如果是这样,我可以认为可读/可写问题是由同步引起的吗?
好吧,看起来我问了一个愚蠢的问题。我的真正意思是,套接字和常规文件都通过文件描述符进行读写,那么为什么套接字描述符具有可读/可写的概念,而常规文件没有呢?由于EJP告诉我这是因为缓冲区和每个描述符都有自己的一对缓冲区,因此我的结论是:可读/可写的概念是针对缓冲区的,如果缓冲区为空,则不可读,而如果缓冲区已满,则不可写。可读性和可写性与同步无关,由于常规文件没有缓冲区,因此它始终是可读和可写的。
还有更多问题:当说到接收缓冲区时,这个缓冲区与int recv(SOCKET socket,char FAR * buf,int len,int flags);
中的缓冲区不是同一个东西,对吗?
int recv()
读取系统缓冲区并将内容复制到应用程序传递的用户缓冲区中。 - alvitsrecv()
将内容传输到用户缓冲区。看起来你对学习系统方面很感兴趣。我建议阅读有关内核模块和驱动程序的资料。 - alvits