Бесконечное чтение (2) с помощью конвейерной команды - PullRequest
1 голос
/ 28 ноября 2011

Я хотел бы иметь некоторую точность о поведении read (2) в системах Linux, Я пытаюсь сделать оболочку, и у меня возникла проблема при чтении ввода. Я делаю что-то вроде

read(0, BUF, 4096);

Итак, дело в bash (и в большинстве оболочек), вы можете передать команду следующим образом:

echo ls | bash

Bash выполнит ls только один раз, но когда я делаю это чтение, всегда возвращаю мне один и тот же буфер, "ls" так что идет в бесконечном цикле. Я хотел знать, почему read (2) не возвращает мне 0, спасибо.

Ответы [ 2 ]

3 голосов
/ 28 ноября 2011

Вам необходимо проверить возвращаемое значение read. Если он возвращает 0, то он достиг конца входного потока. То есть вместо этого:

read(0, BUF, 4096);

нужно написать:

int bytes_read = read(0, BUF, 4096);

и затем проверьте, равен ли bytes_read ноль.

1 голос
/ 28 ноября 2011

Вы, вероятно, не очищаете буфер после каждого чтения.Если читать нечего, read() вернет 0 и ничего не запишет в буфер.Если буфер не очищен, то, что было в нем до раздачи, все еще будет там, поэтому вы продолжаете получать свой бесконечный ls - там все еще есть только оригинальный ls, но вы продолжаете рассматривать его как новый ввод.

...