Другой вывод команды Linux (Piped) в качестве входных данных для моей программы на C

Сейчас я работаю над небольшой программой на Си в Linux. Позвольте мне объяснить вам, что я хочу сделать с примером команды Linux ниже

ls | grep hello

Вышеприведенная команда выполняется со следующей страстью (дайте мне знать, если я ошибаюсь)

  1. команда ls будет выполнена первой
  2. Вывод будет передан команде grep, которая снова сгенерирует вывод, сопоставив "hello"

Теперь я хотел бы написать программу на C, которая принимает по конвейеру выходные данные одной команды. Значит, в той же страсти, как программа "grep" смогла получить ввод от команды ls (в моем примере выше).

Аналогичный вопрос был задан другим пользователем здесь , но по какой-то причине эта тема была помечена как "Недопустимый вопрос"

Сначала я думал, что мы можем получить это как аргумент командной строки для C-программы. Но это не так.

4 голоса | спросил Santhosh Reddy Mandadi 1 J0000006Europe/Moscow 2013, 22:00:00

2 ответа


0

Если вы перенаправите вывод одной команды в другую, этот вывод будет доступен на стандартном вводе принимающего процесса (stdin).

Вы можете получить к нему доступ, используя обычные scanf или fread функции. scanf и т. п. работают с stdin по умолчанию (так же, как printf работает с stdout по умолчанию; при отсутствии канала stdin присоединяется к терминалу), а стандартная библиотека C предоставляет FILE *stdin для таких функций, как fread, которые читают из потока FILE.

POSIX также предоставляет макрос STDIN_FILENO в unistd.h, для функций, которые работают с дескрипторами одного файла. По сути, это всегда будет 0, но не стоит полагаться на это.

ответил Cairnarvon 1 J0000006Europe/Moscow 2013, 22:06:52
0

Если факт, то ls и grep начинается одновременно.

ls | grep hello означает, используйте ls стандартный вывод как стандартный ввод grep. ls записать результаты в стандартный вывод, grep ждет и читает любой вывод из стандартного ввода сразу.

Все еще есть сомнения? Сделай эксперимент. запустить

find / | grep usr

find / перечислит все файлы на компьютере, это займет много времени.

Если сначала запускается ls, то ОС передает вывод grep, мы должны долго ждать с пустым экраном, пока find закончится и grep запущено. Но мы видим результаты сразу, и это тому доказательство.

ответил 比尔盖子 1 J0000006Europe/Moscow 2013, 22:08:23

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132