为什么select()在它之前停止输出?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么select()在它之前停止输出?相关的知识,希望对你有一定的参考价值。
我正在阅读Beej的《网络编程指南》,以期使我深入理解C语言中的select()函数。据我所知,它会停止它之后的所有操作,直到它中的文件描述符之一为止。由于某些外部手段(例如telnet),其中之一可用。但是我发现的是,如果我的程序中有select()(设置为无限超时),则直到select返回之后,程序的先前部分都不会显示输出(如printf表示已绑定套接字),但是如果我注释掉选择功能,则所有内容均可正确打印。这可能是我之前在程序中弄糟的东西,所以这是我复制的代码以对其进行测试:
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
int main()
//sets the address structure
struct sockaddr_in server_address;
server_address.sin_family = AF_INET;
server_address.sin_port = htons(8888);
server_address.sin_addr.s_addr = INADDR_ANY;
fd_set master_fds;
fd_set read_fds;
int fdmax;
int listener;
int clients[10];
char buffer[256];
//zeros the file descriptor lists
FD_ZERO(&master_fds);
FD_ZERO(&read_fds);
//gets a socket and binds it
listener = socket(AF_INET, SOCK_STREAM, 0);
bind(listener, (struct sockaddr*)&server_address, sizeof(server_address));
printf("listener bound")
//make listener listen
listen(listener, 10);
printf("listening");
//add listener to the faster file descriptor set
FD_SET(listener, &master_fds);
fdmax = listener;
read_fds = master_fds;
select(fdmax + 1, &read_fds, NULL, NULL, NULL);
return 0;
有点混乱,但我只是仔细检查了一下。当我编译并运行此程序时,直到所有上述printfs都显示且程序终止时,在我远程登录到该程序之前,不会显示任何输出。删除select()可使一切显示在应有的时间。
发生这种情况是否有充分的理由,或者我在上面做错了什么?
答案
这几乎可以肯定是因为直到select
调用返回[[after
以上是关于为什么select()在它之前停止输出?的主要内容,如果未能解决你的问题,请参考以下文章
js运行时间比较长,怎么才能在它运行之前页面置灰并且有请等待的提示