0
调用read后居然会发生什么:读取后会发生什么叫做一个Linux插座
n = read(fd, buf, try_read_size);
这里fd是一个TCP套接字描述符。 buf是缓冲区。 try_read_size是程序试图读取的字节数。
我想这可能会最终调用一个系统调用内核。但任何人都可以提供一些细节?说在glibc或内核源代码中的源代码实现?
调用read后居然会发生什么:读取后会发生什么叫做一个Linux插座
n = read(fd, buf, try_read_size);
这里fd是一个TCP套接字描述符。 buf是缓冲区。 try_read_size是程序试图读取的字节数。
我想这可能会最终调用一个系统调用内核。但任何人都可以提供一些细节?说在glibc或内核源代码中的源代码实现?
从高层的角度来看,这是会发生什么:
buf
至buf+try_read_size
指的是可访问的内存页面,fd
实际上是一个文件描述符)。如果出现错误,会生成负面的错误代码(例如-EFAULT),将CPU切换回用户模式,然后调用返回到包装器。proc
项或更多的东西异国读)min(available, try_read_size)
复制到buf
,将数量写入返回码寄存器(x86上的EAX),CPU将切换回用户模式,并且调用返回到包装。-EAGAIN
)被写入到如果套接字非阻塞的返回码寄存器中,CPU切换回用户模式和呼叫返回到包装。+1,非常好。如果进程暂停,它会阻塞,直到至少接收到一个字节的数据或接收到一个FIN,或者在套接字上发布错误,则包含此信息的最外面的项目符号重新开始。 – EJP 2012-04-22 23:14:56
内核的细节实在是太复杂了短,所以回答。顺便说一句,你为什么不自己检查一下? – 2012-04-19 10:38:50
@KarolyHorvath我试过但完全迷路了。任何方向或建议获取细节?我会高度赞赏它。 – ericzma 2012-04-19 10:46:48
从linux内核源代码读取fs/read_write.c,看看发生了什么。 – strkol 2012-04-19 10:50:36