LINUX.ORG.RU

вопрос про select()

 


0

1

Я жду селектом инпут из пайпа:

mkfifo /tmp/test_pipe
#include <sys/select.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>

#include <assert.h>

int main(int argc, char **argv) {

  int fd = open("/tmp/test_pipe", O_RDONLY);
  char buf[1024];

  fd_set rset;
  FD_ZERO(&rset);
  FD_SET(fd, &rset);

  int rv = select(fd+1, &rset, NULL, NULL, NULL);
  if (rv > 0) {
    if(FD_ISSET(fd, &rset)) {
      int len = read(fd, buf, 1023);
      printf("rv=%d, read %d bytes\n", rv, len);
      buf[len] = '\0';
      printf("%s", buf);
    }
  } else {
    perror("select");
  }


  FD_ZERO(&rset);
  FD_SET(fd, &rset);

  rv = select(fd+1, &rset, NULL, NULL, NULL);
  if (rv > 0) {
    if(FD_ISSET(fd, &rset)) {
      int len = read(fd, buf, 1023);
      assert(len);
      printf("rv=%d, read %d bytes\n", rv, len);
      buf[len] = '\0';
      printf("%s", buf);
    }
  } else {
    perror("select");
  }

  return 0;
}

в пайп пишу строку:

echo lalala > /tmp/test_pipe

Программа выводит

rv=1, read 7 bytes
lalala
a.out: test.c:42: main: Assertion `len' failed.
Aborted

Вопросы: почему второй селект возвращает 1? Почему он вообще возвращается?

Может ко второму вызову файл закрыт, и селект считает, что это не ошибка?

ziemin ★★ ()

man select_tut

     9.  If the functions read(2), recv(2), write(2), and send(2)
         fail with errors  other than those listed in  7., or one
         of  the input  functions  returns 0,  indicating end  of
         file,  then  you  should  not pass  that  descriptor  to
         select()  again.   In the  example  below,  I close  the
         descriptor immediately, and then set it to -1 to prevent
         it being included in a set.

man read

RETURN VALUE
     On  success, the  number  of bytes  read  is returned  (zero
     indicates end of file)
yoghurt ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.