Отладка системного вызова read () - не продолжается до тех пор, пока не будет нажата CTRL-C - PullRequest
0 голосов
/ 14 ноября 2010

Привет, мне нужно использовать системный вызов 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 working\n");
      }
  }

удаление символа "\ n" заставляет его напечатать "Чтение работает" 3 раза после прочтения третьего ввода. наличие символа будет печатать после каждого ввода.

Ответы [ 2 ]

0 голосов
/ 14 ноября 2010

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

для моего оригинального кода:

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

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

0 голосов
/ 14 ноября 2010

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

...