每个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]

客户端连接到服务器后,服务器终端上的输入将被阻止,直到客户端断开连接。这是终端缓冲区中的阻塞数据吗? 如果输入数据大于终端的缓冲区,会发生什么情况

tcp堆栈中有一个类似的缓冲区。当应用程序不处理缓冲区中的数据时,tcp将调整窗口大小,以便发送方不再发送数据。航站楼是否有这样的机制

每个Linux fd都有这样的缓冲区吗?缓冲区的大小是由实现决定的吗


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都有缓冲区。