为什么select()会先停止输出?

为什么select()会先停止输出?,c,select,C,Select,我正在看Beej的《网络编程指南》,试图了解C中的select函数。我的理解是,它会停止它后面的所有操作,直到它的一个集合中的一个文件描述符由于某种外部手段(如telnet)变得可用为止。但我发现,如果我将程序中的select设置为“无限超时”,则在select返回之前,不会显示程序先前部分的输出(如printf表示套接字已绑定),但如果我注释掉select函数,则所有内容都会正确打印。这可能是我之前在程序中弄糟的东西,所以这是我复制来测试它的代码: 包括 包括 包括 包括 包括 包括 包括 包

我正在看Beej的《网络编程指南》,试图了解C中的select函数。我的理解是,它会停止它后面的所有操作,直到它的一个集合中的一个文件描述符由于某种外部手段(如telnet)变得可用为止。但我发现,如果我将程序中的select设置为“无限超时”,则在select返回之前,不会显示程序先前部分的输出(如printf表示套接字已绑定),但如果我注释掉select函数,则所有内容都会正确打印。这可能是我之前在程序中弄糟的东西,所以这是我复制来测试它的代码:

包括 包括 包括 包括 包括 包括 包括 包括 int main { //设置地址结构 服务器地址中的结构sockaddr\u; 服务器地址.sin\u family=AF\u INET; 服务器\地址.sin\端口=htons8888; server_address.sin_addr.s_addr=INADDR\u ANY; fd_设置主控_fds; fd_设置读取_fds; int-fdmax; int侦听器; 国际客户[10]; 字符缓冲区[256]; //将文件描述符列表归零 FD_ZERO&master_fds; FD_ZERO&read_fds; //获取一个套接字并绑定它 侦听器=socketAF_INET,SOCK_STREAM,0; bindlistener,struct sockaddr*&服务器地址,sizeofserver地址; printflistener界 //让听众倾听 listenlistener,10岁; 印刷术; //将侦听器添加到更快的文件描述符集 FD_SETlistener和master_fds; fdmax=侦听器; read_fds=master_fds; 选择fdmax+1,并读取fds,NULL,NULL,NULL; 返回0; } 有点乱,但我只是仔细检查了一下。当我编译并运行它时,直到我将telnet连接到它,当上面所有的printfs显示并且程序终止时,才会显示任何输出。删除“选择”会使所有内容在应该显示的时候显示


发生这种情况的原因是否充分,或者我是否犯了上述错误?

这几乎可以肯定,因为输出缓冲区直到select调用返回后才会刷新。printf调用不会以换行结束,因此,即使是在每行之后刷新的行缓冲,也不会进行刷新

如果您正在向终端设备写入数据,只需确保在每次输出后发送换行符,并刷新换行符,如:

printf("listener bound\n"); // or
puts("listener bound");
如果您不需要换行符,或者如果您重定向输出,使其完全缓冲,而不是行缓冲,这样换行符就不会产生效果,则必须在输入select之前执行FFLUSSTDOUT

a我怀疑你会这样做,因为如果你不这样做的话,你会得到一个相当丑陋的结局:

listener boundlistening

这几乎可以肯定,因为输出缓冲区直到select调用返回后才会刷新。printf调用不会以换行结束,因此,即使是在每行之后刷新的行缓冲,也不会进行刷新

如果您正在向终端设备写入数据,只需确保在每次输出后发送换行符,并刷新换行符,如:

printf("listener bound\n"); // or
puts("listener bound");
如果您不需要换行符,或者如果您重定向输出,使其完全缓冲,而不是行缓冲,这样换行符就不会产生效果,则必须在输入select之前执行FFLUSSTDOUT

a我怀疑你会这样做,因为如果你不这样做的话,你会得到一个相当丑陋的结局:

listener boundlistening