iKapex
@iKapex

Как настроить функцию select на каналы?

Всем привет.
Помогите, пжл, с вызовом select - у меня есть в директории два файла созданных с помощью mkfifo - in1 и in2. И я пишу в них с помощью echo
echo "hi"> in1

хочу чтобы можно было одновременно писать что-то в эти файлы и читать из них.
Делаю
echo "hey"> in1

и вижу
Descriptor f1 = 3
Descriptor f2 = 4
temp = 56 
temp = 53 
temp = 73 
send f1 = 3
Descriptor f1 = 5
Descriptor f2 = 6
temp = 56 
temp = 53 
temp = 73 
send f1 = 5


И не понимаю - почему информация дублируется?!
Почему написано два раза send f1 = 3 и send f1 = 5 - понять не могу - я ж один раз всего записала.

Вот код

void read_and_calc(int fd) {
  char buf[100];

  int bytes = read(fd, buf, 100);
  int temp = 0;
  int i;
  for(i = 0; i < strlen(buf) - 1; i++) {
    int temp = buf[i] - '0';
    sum += temp;
    printf("temp = %d \n", temp);
  }
  buf[bytes] = 0;
}

while(1) {
  int f1 = open("./in1", O_NONBLOCK | O_RDONLY);
  int f2 = open("./in2", O_NONBLOCK | O_RDONLY);

  if(!(f1 && f2)) {
    printf("%d\n", sum);
    return 0;
  }

  FD_ZERO(&read_set);
  FD_SET(f1, &read_set);
  FD_SET(f2, &read_set);

  int pipe_num = select(f2 + 1, &read_set, NULL, NULL, NULL);
  if(pipe_num > 0){

    if (FD_ISSET (f1, &read_set)){
      read_and_calc(f1);
      printf("send f1 = %d\n", f1);
    }

    else if (FD_ISSET (f2, &read_set)){
      read_and_calc(f2);
      printf("send f2 = %d\n", f2);
    }
  }
}

всем спасибо.
  • Вопрос задан
  • 116 просмотров
Пригласить эксперта
Ответы на вопрос 1
Тут не так примерно все, вы просто не понимаете что происходит. Во-первых в бесконечном цикле идет открытие файлов, чего скорей всего не подразумевается, они должны быть открыты один раз. Во-вторых

if(!(f1 && f2)) {

не сработает, т.к. в случае сбоя open() возвращается -1. В третьих вы используете strlen для содержимого буфера который был получен не строчной функцией и скорей всего не содержит '\0' (buf[bytes] = 0 надо было написать до strlen).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы