#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
onstdin
— это допустимо только для выходных потоков — использование его во входном потоке приводит к неопределенному поведению .
Ответ №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
.