-1

我需要知道read系统调用是否已读取整个数据。默认情况下read,如果缓冲区中没有数据,系统调用会阻塞,但不能确保数据已被完全读取。请让我知道一个正确的方法来确认。

在手册页中,有人说read系统调用0在遇到文件结尾时返回,我也尝试过,read但根本没有返回0

wr_cnt =write(fd, "AT+CGMI\r", sizeof("AT+CGMI\r"));

  if(wr_cnt<0)
        perror("Write to dev failed");
  else
       printf("No.of bytes written=%d\n",wr_cnt);

  while(1)
  {
      //rd_cnt =read(fd, &str, 1);
      if((rd_cnt =read(fd, &str, 1)) <=0)
    {
            perror("Read to dev failed");
            printf("error no=%d\n",errno);
            break;
    }

        printf("char =%c ->  hex=%x rd_cnt=%d\n",str,str,rd_cnt);
        sleep(3);
        str=0;
 }      

 if(rd_cnt==0)
    printf("EOF met\n");
4

1 回答 1

2

默认情况下,read不会返回零,表示EOF,除非真的是文件结尾,或者连接已经关闭。如果流连接仍然打开,但现在恰好没有可用数据,read则只会“挂起”,直到有东西到达。

有两种解决方案。

  1. 将文件描述符设置为非阻塞模式。如果没有数据,则read返回-1,并将errno设置为EAGAINor (当然,无论如何,EWOULDBLOCK您可能还应该检查)。EINTR输入会阻塞可能还有其他原因,因此您应该短时间重试以确定。

  2. select 阅读前使用。它在您的代码中有点冗长,但在运行时更有效。select仅在可以确定后续读取不会阻塞或达到超时时才返回。您可以将超时解释为流数据的“EOF”。如果您正在从多个流中读取输入,那么select这是绝对必须的。

于 2013-08-23T12:43:38.363 回答