系统调用poll()不适用于Ubuntu Kylin 16.04 32位版本,但适用于Fedora 21 64位

时间:2016-11-03 19:59:06

标签: c polling ubuntu-16.04

这是我的代码的简短版本:我有一个64位Fedora 21,代码工作正常。但是在我安装了ubuntu Kylin 16.04 32位版本的其他32位机器上,当在stdin上输入文本时,poll不会返回,它只会保持阻塞状态。在输入文本后我在gdb中按Ctrl-C,然后尝试执行下一个命令它有效...这是ubuntu 32位版本的错误还是我必须在32位版本上使用不同的轮询?

#include <sys/ioctl.h>
#include <sys/poll.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int
main(int argc, char **argv)
{
  int           sockfd;
  int const  myOPEN_MAX=100,MAXLINE=4096;
  struct pollfd   client[myOPEN_MAX];
  int maxi,nready,n;
  char buf[4096];
  client[0].fd = fileno(stdin);
  client[0].events = POLLRDNORM;
  for (int i = 1; i < myOPEN_MAX; i++){
    client[i].fd = -1;      /* -1 indicates available entry */
  }
  maxi = 1;                 /* max index into client[] array */
  printf("enter something\n");
  for ( ; ; ) {
    nready = poll(client, maxi+1, -1);
    for (int i = 0; i <= maxi; i++) {   /* check all clients for data */
      if ( (sockfd = client[i].fd) < 0)
    continue;
      if (client[i].revents & (POLLRDNORM | POLLERR)) {
        if ( (n = read(sockfd, buf, MAXLINE)) > 0) {
          if (i == 0) { //stdin
            printf("works\n");
           return 0;
          }
          if (--nready <= 0)
           break;               /* no more readable descriptors */
        }
      }
    }
  }
  return 0;
 }

0 个答案:

没有答案