eri*_*zma 2 sockets linux networking
调用 read 后实际发生了什么:
n = read(fd, buf, try_read_size);
Run Code Online (Sandbox Code Playgroud)
这里 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 切换回用户模式并且调用返回到包装器。