微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尽管设置了 O_NONBLOCK 读取块

如何解决尽管设置了 O_NONBLOCK 读取块

如果我在 O_NONBLOCK 文件时设置 open,一切正常。但是当我通过 read 设置 O_NONBLOCKfcntl 会阻塞。怎么了?

#include <fcntl.h>
#include <sys/epoll.h>
#include <unistd.h>
                                                                
#include <stdio.h>

void
make_nonblock(size_t N,int in[N]) {
  for (size_t i = 0; i < N; ++i) {
    int flags = fcntl(in[i],F_GETFL);
    flags |= O_NONBLOCK;
    fcntl(in[i],F_SETFL,flags);
  }
}

extern size_t
read_data_and_count(size_t N,int in[N]) {
  make_nonblock(N,in);
  char buffer[4096];
  size_t total = 0;
  for (size_t i = 0; i < N; ++i) {
    ssize_t current = 0;
    while ((current = read(in[i],buffer,sizeof(buffer))) > 0) {
      total += current;
    }
  }
  return total;
}

int
main(int argc,char** argv) {
  int fds[1024];
  for (int i = 1; i < argc; ++i) {
    fds[i - 1] = open(argv[i],O_RDONLY);
  }
  size_t result = read_data_and_count(argc - 1,fds);
  printf("Result: %ld\n",result);
  return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。