每个Linux fd都有缓冲区吗?
客户端连接到服务器后,服务器终端上的输入将被阻止,直到客户端断开连接。这是终端缓冲区中的阻塞数据吗? 如果输入数据大于终端的缓冲区,会发生什么情况 tcp堆栈中有一个类似的缓冲区。当应用程序不处理缓冲区中的数据时,tcp将调整窗口大小,以便发送方不再发送数据。航站楼是否有这样的机制 每个Linux fd都有这样的缓冲区吗?缓冲区的大小是由实现决定的吗每个Linux fd都有缓冲区吗?,linux,io,linux-kernel,Linux,Io,Linux Kernel,客户端连接到服务器后,服务器终端上的输入将被阻止,直到客户端断开连接。这是终端缓冲区中的阻塞数据吗? 如果输入数据大于终端的缓冲区,会发生什么情况 tcp堆栈中有一个类似的缓冲区。当应用程序不处理缓冲区中的数据时,tcp将调整窗口大小,以便发送方不再发送数据。航站楼是否有这样的机制 每个Linux fd都有这样的缓冲区吗?缓冲区的大小是由实现决定的吗 void echo(const clientinfo &ci){ size_t n; char buff[MAXLEN]
void echo(const clientinfo &ci){
size_t n;
char buff[MAXLEN];
rio_t rio;
Rio_readinitb(&rio,ci.fd);
while((n = Rio_readlineb(&rio,buff,MAXLEN)) != 0){
std::cout << "server received " << n << " bytes from "<< ci.client_hostname << " port " <<ci.client_port <<std::endl;
std::cout << buff;
Rio_writen(ci.fd,buff,n);
}
}
void command(){
char buf[MAXLEN];
if(!fgets(buf,MAXLEN,stdin))
return;
std::cout << buf;
}
int main(int argc,char **argv){
int listenfd,connfd;
socklen_t clientlen;
sockaddr_storage clientaddr;
fd_set read_set,ready_set;
clientinfo ci;
if(argc != 2){
std::cerr << "usage: " << argv[0] << " <port>" << std::endl;
exit(0);
}
listenfd = open_listenfd(argv[1]);
FD_ZERO(&read_set);
FD_SET(STDIN_FILENO,&read_set);
FD_SET(listenfd,&read_set);
while(1){
ready_set = read_set;
if(select(listenfd+1,&ready_set,NULL,NULL,NULL) < 0)
unix_error("select error");
if(FD_ISSET(STDIN_FILENO,&ready_set))
command();
if(FD_ISSET(listenfd,&ready_set)){
clientlen = sizeof(sockaddr_storage);
ci.fd = accept(listenfd,(sockaddr*)&clientaddr,&clientlen);
getnameinfo((sockaddr*)&clientaddr,clientlen,ci.client_hostname,MAXLEN,ci.client_port,MAXLEN,0);
std::cout << "connect from " << ci.client_hostname << " port " << ci.client_port <<std::endl;
echo(ci);
close(ci.fd);
}
}
}
void echo(const clientinfo&ci){
尺寸;
字符buff[MAXLEN];
里约热内卢;
里约热内卢(Rio,ci.fd),;
while((n=Rio_readlineb(&Rio,buff,MAXLEN))!=0){
std::coutA由内核为一个进程创建。通常这是通过。open
将一个进程特定的编号(文件描述符)与一个由内核管理的设备相关联
在此之后,进程可以从其文件描述符读取数据。这通常通过或完成。两个系统调用都写入缓冲区。这是否意味着文件描述符拥有缓冲区,缓冲区是进程内存的一部分?我不这么认为
但是当人们谈论缓冲区时,read
写入缓冲区这一事实通常并不意味着。通常,如果两个进程相互对话,人们会谈论由内核管理的。每个进程都有自己的文件描述符,中间是缓冲区。这是否意味着缓冲区由两个f中的一个拥有ile描述符?我也不这么认为
但是是的:缓冲区无处不在。硬件设备在缓冲。设备驱动程序在缓冲。内核缓存(缓冲)内存页。管道缓冲。C库缓冲。用户模式程序缓冲
否:没有缓冲区,缓冲区很多。文件描述符没有缓冲区。像C库这样的库提供缓冲区。是的,但每个fd都有一个与之相关的缓冲区。如果你知道的话,为什么你会问?我不确定我的理解是否正确取决于驱动程序。串行端口通常在硬件中缓冲8或16个字符。有些是altime音频代码不缓冲以避免延迟。网络设备可能有相当大的数据包缓冲区。因此不能保证所有FD都有缓冲区。