Системный вызов Debugging read() — не продолжает выполняться до нажатия CTRL-C

#c #system-calls

#c #системные вызовы

Вопрос:

Привет, мне нужно использовать системный вызов read() для чтения из ввода-вывода. У меня есть следующий код

 //Reading in the commands
for(;;) {
    n = read( fd, buf, 128 );
    fflush(stdin);
    printf("---n");
}
  

Он не будет печатать строку «—» до тех пор, пока я не завершу программу, тогда он будет печатать все сразу. Я также пытался очистить входной поток, но безуспешно. Я не очень хорошо знаком с read() , поэтому я точно не знаю, как это работает. Причина, по которой мне нужно использовать read() , заключается в том, что мне нужно заставить CTRL-D завершить программу. Не мог бы кто-нибудь просветить меня относительно того, почему это происходит и как действовать дальше? Заранее спасибо.

PS: Я провел еще несколько тестов и получил интересный результат:

 for(i;i<3;i  ) {
      if( read( fd, buf, 128 ) < 0) {
        printf("Read returned less than 0");
      } else {
          printf("Read is workingn");
      }
  }
  

удаление символа » n» заставляет его печатать «Чтение выполняется» 3 раза после считывания третьего ввода. наличие символа в нем приведет к его печати после каждого считывания входных данных.

Комментарии:

1. Никогда не вызывайте fflush on stdin — это допустимо только для выходных потоков — использование его во входном потоке приводит к неопределенному поведению .

Ответ №1:

Вам нужно проверить возвращаемое значение ‘read‘, чтобы обнаружить EOF в STDIN (т. Е. нажать Ctrl-D). Опубликованный вами код представляет собой бесконечный цикл.

Комментарии:

1. да, предполагается, что цикл будет бесконечным, пока пользователь не нажмет CTRL-D.

2. также read() возвращает размер, в котором он был прочитан. Ctrl-D вернет значение 2 и отрицательное значение, если произошла ошибка. Возвращает ли он что-нибудь особенное для EOF?

Ответ №2:

Я все еще не знаю, почему он это делал, но fflush(stdout) перед повторным циклом проблема решается.

для моего исходного кода:

 //Reading in the commands
for(;;) {
    n = read( fd, buf, 128 );
    fflush(stdin);
    [Other statements]
    fflush(stdout);
}
  

решена проблема. Все еще задаетесь вопросом, зачем это нужно делать.

Комментарии:

1. Пожалуйста, прочтите приведенный выше комментарий относительно fflush(stdin) и / или справочную страницу для fflush .