LINUX.ORG.RU

функция select


0

1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <wait.h>
#include <time.h>

int fd[100][2];
fd_set read_set;
struct timeval val;

int main(int argc, char *argv[], char *env[]) {
   val.tv_sec = 0;
   val.tv_usec = 0;
   for (int i = 0; i < 10; ++i) {
      pipe(fd[i]);
      FD_SET(fd[i][0], &read_set);
   }
   printf("%d\n", select(30, &read_set, NULL, NULL, &val));//если эту строчку закомментировать, ожидаемый результат будет совпадать с результатом работы программы(выведет 10)
   for (int i = 0; i < 10; ++i) {
      write(fd[i][1], "sad", 2);
   }
   printf("%d\n", select(30, &read_set, NULL, NULL, &val));
   return 0;
}

Вывод: два нуля. Правильно ли я понимаю, что функция select модифицирует передаваемые ей множества дескрипторов(исключает те дескрипторы, которые заблокированы для чтения/записи)? Задаю данный вопрос, тк соответствующей информации в мане не нашел.



Последнее исправление: iwsyhgia (всего исправлений: 2)

Вы про то, что она обнуляет у вас read_set? Вроде в man'е так и написано:

On exit, the sets are modified in place to indicate which file descriptors actually changed status.

mky ★★★★★
()
#include <sys/select.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <wait.h>
#include <time.h>

int fd[10][2];
fd_set read_set,buff_rs;
struct timeval val;

int main(int argc, char *argv[], char *env[])
{
   val.tv_sec = 0;
   val.tv_usec = 0;
   for (int i = 0; i < 10; ++i)
   {
      pipe(fd[i]);
      FD_SET(fd[i][0], &read_set);
   }

      buff_rs=read_set;

   printf("%d\n", select(30, &buff_rs, NULL, NULL, &val));//если эту строчку закомментировать, ожидаемый результат будет совпадать с результатом работы программы(выведет 10)
   for (int i = 0; i < 10; ++i)
   {
      write(fd[i][1], "sad", 2);
   }
      buff_rs=read_set;

   printf("%d\n", select(30, &buff_rs, NULL, NULL, &val));
   return 0;
}





Dron ★★★★★
()
Последнее исправление: Dron (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.