为什么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()在它之前停止输出?的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL存储过程 - 无法将输出值分配给变量

js运行时间比较长,怎么才能在它运行之前页面置灰并且有请等待的提示

如何杀死正在运行的 SELECT 语句

为啥这个异步函数在它之前定义的等效 Promise.then 链之前执行?

在objective-c中,睡眠发生在它之前的代码之前

结构不是为节点创建的,但是在初始化节点时,如果我们在它之前编写结构,代码工作正常,没有错误。为啥?