Реализация служебной команды «more» Unix - PullRequest
4 голосов
/ 24 марта 2012

Я пытаюсь реализовать команду more. Я хочу узнать, как я могу понять, если есть труба. Например, если я наберу из оболочки

cat file1 file2 | more

как я могу справиться с этим внутри реализации more?

И доступна ли реализация more с открытым исходным кодом?

На самом деле я не смог прочитать stdin. Мне удалось сделать больше file.txt, но не cat file | подробнее ..

Я думаю, что я должен сначала прочитать от пользователя и поставить буфер, чем печатать буфер. мой код содержит:

if(argc == 1)
{
  fgets(line, 255, 0);
   printf("%s", line);
} 

но выдает ошибку.

Ответы [ 2 ]

4 голосов
/ 24 марта 2012

Чем больше синтаксис

more [options] [file_name]

Если вы не укажете имя файла, команда more получает ввод от stdin ; Вы можете предоставить этот ввод (через stdin ), используя канал, например:

cat file.txt | more

Отправляет вывод команды cat на more . Это то же самое, что и:

more file.txt

Вам не нужно специально знать, есть ли труба или нет; вам просто нужно проверить, было ли передано имя файла в качестве аргумента more . Если это так, входные данные считаются содержимым файла. Если нет, считается, что ввод произошел от stdin .

Что касается исходного кода, то поиск в Google займет у вас долгий путь. Вот некоторый старый исходный код из FreeBSD:

http://svnweb.freebsd.org/base/stable/2.0.5/usr.bin/more/

Или более новый источник из репозиториев Ubuntu:

http://bazaar.launchpad.net/~vcs-imports/util-linux-ng/trunk/files/head:/text-utils/

0 голосов
/ 06 июня 2012

предложите сначала проверить argc, равен ли 1, если равен 1, вы должны использовать stdin в качестве дескриптора входного файла, чтобы ваша программа могла обработать ситуацию как cat file.txt |более

...