Вопрос по пайпам (pipes)

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
Zhbr
новенький
Сообщения: 44
Зарегистрирован: 31.01.2014 02:34:21

Вопрос по пайпам (pipes)

Сообщение Zhbr »

Приветствую.
Вопрос следующий, никак не могу понять как принять своей программой пайп. То есть через TProcess можно реализовать запуск команды иполучить ее вывод, это все происходит внутри программы. Хотелось бы подать данные сразу на мою программу и чтобы она их приняла. Короче чтобы програ могла в конвеерах работь. Ну к примеру:
cat file.txt | my_program
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

Код: Выделить всё

program my_program;

var c:char;

begin
   while not eof(stdin) do begin
      read(stdin,c);
      ...
   end
end.


- Это концепция, есличто, реально компилируемый код:

Код: Выделить всё

program my_program;

var c:char;

begin
   while not eof(input) do begin
      read(input,c);
      (*...*)
   end
end.



???
Zhbr писал(а): Ну к примеру:
cat file.txt | my_program
Zhbr
новенький
Сообщения: 44
Зарегистрирован: 31.01.2014 02:34:21

Сообщение Zhbr »

Как все просто оказалось :D даже стыдно. Спасибо.
Но если честно в вики ничего подобного не нашел.
mirk
постоялец
Сообщения: 319
Зарегистрирован: 24.09.2007 10:03:39

Сообщение mirk »

Если пайпы работают через простой readln, то что тогда делают AssignPipe и POpen?
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

mirk писал(а):Если пайпы работают через простой readln, то что тогда делают AssignPipe

http://www.freepascal.org/docs-html/rtl ... npipe.html
Создаёт пару пайп, через которую можно прогонять сообщения внутри программы. Предполагаю, что это полезно, например, для передачи данных из одного потока в другой.

и POpen?

http://www.freepascal.org/docs-html/rtl ... popen.html
Запускает процесс, ввод или вывод которого управляется из программы.

Полагаю, обе функции работают только в линуксе (а POpen, видимо, вообще является надстройкой над стандартным popen).

Readln в консольной программе по умолчанию читает stdin. Постановка вопроса непонятна.
mirk
постоялец
Сообщения: 319
Зарегистрирован: 24.09.2007 10:03:39

Сообщение mirk »

Дож писал(а):Постановка вопроса непонятна.

Подойдем с другого края - в каких случаях мне надо использовать readln, в каких AssignPipe, в каких POpen?
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

Когда нужно прочесть из какого-то файла строку текста -- можно использовать Readln.

Когда в программе есть несколько тредов, и есть необходимость родительскому треду взаимодействовать со своим подтредом, то можно использовать AssignPipe, который создаст так называемую анонимную пайпу, через которую можно будет пересылать данные от одного треда к другому.

Когда нужно запустить внешнюю программу, при этом что-то отправить ей на вход или что-то прочесть с её выхода (что-то одно), -- можно использовать POpen.
Ответить