English 中文(简体)
使用选择(...)作为事件驱动环绕吗?
原标题:use select(...) as an event driven loop?
...
/* Initialize the input set */
FD_ZERO(&input);
FD_SET(fd, &input);
FD_SET(sock, &input);

max_fd = (sock > fd ? sock : fd) + 1;

/* Do the select */
n = select(max_fd, &input, NULL, NULL, NULL);

/* See if there was an error */
if (n < 0)
  perror("select failed");
else if (n == 0)
  puts("TIMEOUT");
else
{
  /* We have input */
  if (FD_ISSET(fd, &input))
process_fd();
  if (FD_ISSET(sock, &input))
process_socket();
}

I am wondering wouldn t this approach exit out as soon as one of the descriptors is ready.
What if I want to read both the descriptors?

I still want to use select(...) to figure out which is ready first to be processed first. I tried putting the whole thing in a loop, but then it blocks forever.


最新更新

  328     fd_set readfds; FD_ZERO(&readfds);
  329     int waiting = 2;
  330     while(waiting) {
  331 
  332       FD_SET(sockv4query, &readfds);
  333       FD_SET(sockv6query, &readfds);
  334 
  335       /* one greater than the highest fd number */
  336       int nfds = (sockv4query > sockv6query ? sockv4query : sockv6query) + 1;
  337 
  338       if (
  339          select(
  340                  nfds,         /* number of fds */
  341                  &readfds,     /* set of read fds */
  342                  NULL,         /* set of write fds */
  343                  NULL,         /* set of exception fds */
  344                  NULL          /* maximum wait interval */
  345                ) < 0
  346        ) {
  347         perror("select(...)");
  348         continue;
  349       } else {
  350 
  351         /* one or more descriptors is ready */
  352         if(FD_ISSET(sockv4query, &readfds)) {
  353           receive_response_and_echo(sockv4query);
  354           waiting -= 1;
  355         }
  356         if(FD_ISSET(sockv6query, &readfds)) {
  357           receive_response_and_echo(sockv6query);
  358           waiting -= 1;
  359         }
  360       }
  361     }
问题回答

我会做一些类似的事情。

      328     fd_set readfds; FD_ZERO(&readfds);
      329     int process_fd1 = 1,process_fd2 = 1;
      330     while(process_fd1 || process_fd2) {
      331 
      332       FD_SET(sockv4query, &readfds);
      333       FD_SET(sockv6query, &readfds);
      334 
      335       /* one greater than the highest fd number */
      336       int nfds = (sockv4query > sockv6query ? sockv4query : sockv6query) + 1;
      337 
      338       if (
      339          select(
      340                  nfds,         /* number of fds */
      341                  &readfds,     /* set of read fds */
      342                  NULL,         /* set of write fds */
      343                  NULL,         /* set of exception fds */
      344                  NULL          /* maximum wait interval */
      345                ) < 0
      346        ) {
      347         perror("select(...)");
      348         continue;
      349       } else {
      350 
      351         /* one or more descriptors is ready */
      352         if(FD_ISSET(sockv4query, &readfds)) {
      353           receive_response_and_echo(sockv4query);
      354           process_fd1 = 0;
      355         }
      356         if(FD_ISSET(sockv6query, &readfds)) {
      357           receive_response_and_echo(sockv6query);
      358           process_fd2 = 0;
      359         }
      360       }
      361     }




相关问题
Fastest method for running a binary search on a file in C?

For example, let s say I want to find a particular word or number in a file. The contents are in sorted order (obviously). Since I want to run a binary search on the file, it seems like a real waste ...

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

Tips for debugging a made-for-linux application on windows?

I m trying to find the source of a bug I have found in an open-source application. I have managed to get a build up and running on my Windows machine, but I m having trouble finding the spot in the ...

Trying to split by two delimiters and it doesn t work - C

I wrote below code to readin line by line from stdin ex. city=Boston;city=New York;city=Chicago and then split each line by ; delimiter and print each record. Then in yet another loop I try to ...

Good, free, easy-to-use C graphics libraries? [closed]

I was wondering if there were any good free graphics libraries for C that are easy to use? It s for plotting 2d and 3d graphs and then saving to a file. It s on a Linux system and there s no gnuplot ...

Encoding, decoding an integer to a char array

Please note that this is not homework and i did search before starting this new thread. I got Store an int in a char array? I was looking for an answer but didn t get any satisfactory answer in the ...

热门标签