| | | | |
StdIn, StdOut и StdErr. Перенаправление, чтение и запись. | Полный текст материала
Другие публикации автора: Сергей Горбань
Цитата или краткий комментарий: «... ЗАДАЧА:
запустить процесс (некий файл), передать ему команды и получить от него результаты работы. Вставить полученные результаты на страницу сайта.
Причем в целях совместимости механизмы передачи данных ДОЛЖНЫ быть стандартными - StdIn, StdOut, StdErr.
...» |
Важно:- Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
- Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
- При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
- Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.
Добавить свое мнение.
| | Содержит полезные и(или) интересные сведения | [1] | 12 | 92.3% | | | | Ничего особенно нового и интересного | [2] | 1 | 7.7% | | | | Написано неверно (обязательно укажите почему) | [3] | 0 | 0% | | Всего проголосовали: 13 | | | Все понятно, материал читается легко | [1] | 10 | 90.9% | | | | Есть неясности в изложении | [2] | 1 | 9.1% | | | | Непонятно написано, трудно читается | [3] | 0 | 0% | | Всего проголосовали: 11 |
[Mailslot, pipes] [Ввод/вывод (StdIn/StdOut)]
Отслеживать это обсуждение
Всего сообщений: 1717-03-2009 08:21
17-03-2009 02:19Под седьмыми делфями все нормально работает, а в CG-2009 проблемы с кодировкой.
Нужно в ReadStrFromChild и WriteStrToChild String на AnsiString поменять. Для быстрого решения простой задачи - этот вариант как раз. |
|
22-02-2009 04:02Есть траблы небольшие - у меня ping возвращает строку в OEM-кодировке, а CMD, например, в ANSI, т.е. нельзя предугадать, что я получу в результате роботы этой программы. Для первого случая нужно использовать OEMToANSI, но тогда во втором случае получаются крякозябры:) Но в целом статья очень хорошая:) |
|
08-08-2008 16:21Отличная статья. Хотя время консольных приложений ушло, но всетаки очень интересно и поучительно.
Из минусов можно отметить отсутствие описания по StdErr. Но это не столь важно. |
|
10-04-2008 06:06Очень полезное содержание, даже не смотря на давность все еще сохраняет свою актуальность! |
|
13-10-2006 20:33Опрос - самая непродуктивная деятельность процессора, наряду со Sleep() это вообще самое безграмотное из работающего :-)
Значить, во-первых есть overlapped IO, во во-вторых есть функции типа WaitFor, я думаю, автору не составит большого труда перепеисать цикл опроса (судя по всему, доки читать он умеет), а идея следующая - в цикле ждать набор хэндлов: процесса (на предмет завершения консольного процесса) и события, ассоциированного с overlapped ioСообщение не подписано |
|
29-06-2006 22:41
15-12-2005 07:07Автору спасибо! Прям то что мне нужно! |
|
28-11-2005 09:53Толково и очень полезно Сообщение не подписано |
|
06-09-2005 01:46кстати, вместо GetMem/FreeMem(chbuf) вполне достаточно описать chbuf как array[0..1024] of Char, а не PChar и забыть про проблемы с памятью |
|
03-08-2005 05:30Отмечу, что модуль в принципе верен. Но для многопоточного использования подходит плохо.
Я поправил ряд мест, показавшихся мне наиболее "ошибкоопасными".
В частности, привожу поправленную версию функции чтения:
function TChildProc.ReadStrFromChild(Timeout: Integer): String;
Var
i: Integer;
dwRead, DesBufSize: DWORD;
chBuf: PChar;
Res: Boolean;
begin
GetMem(chBuf, 1024);
Try
Repeat
For i:=0 to 9 do
begin Res:=PeekNamedPipe(FChildStdoutRd, nil, 0, nil, @DesBufSize, nil);
Res:=Res and (DesBufSize > 0);
If Res Then Break;
Sleep(Round(Timeout/10));
end;
If Res Then
begin Res:=ReadFile(FChildStdoutRd, chBuf^, 1024, dwRead, Nil); Result:=Result+LeftStr(chBuf, dwRead);
end;
Until not Res;
Except
Result:='Read Err';
End;
FreeMem(chbuf);
end;
Я понимаю, что работа с памятью здесь тоже далека от совершенства, но по крайней мере мой веб-сервер не вылетает по нехватке памяти :-))) |
|
08-01-2003 18:23идея сама по себе стара, только вот качество кода просто пугает!
function TChildProc.ReadStrFromChild(Timeout: Integer): String;
я думаю этой функции достаточно понять почему (она как раз в статье полностью представлена!)
1. Сказал "New" - скажи "Dispose"
2. Эээ.... только это не к данному моменту! тут вообще непонятно к чему New!
вобщем работа с памятью просто безжалостная! я не удивлюсь если этот вэб сервер раз в сутки перегружают по нехватке памяти!
|
|
24-12-2002 09:57Замечательная статья, спасибо Сергею, но...
У меня вопрос: как всё это будет себя вести под Win98? |
|
23-12-2002 23:51Это все хорошо, но может быть кто-нить знает как получить содержимое консольного окна в виде текста если известен его handle? Уже пару лет пытаюсь найти решение этой задачи :(( Ведь винда это как-то делает (Правка -> Выделить -> Копировать... и т.п.) |
|
23-12-2002 21:31А вот это что за чудо:
chBuf:=PChar(Data+Chr($0D)+Chr($0A));
Надо б так:
chBuf:=PChar(Data+#13#10);
Зачем через Chr?
|
|
23-12-2002 20:19Да, забыл подписаться. У кого есть ответ на мой вопрос или способ решения моей проблемы - буду благодарен за ответ на e-mail. |
|
23-12-2002 20:17А чем не понравился способ:
AllocConsole
CreateProces // с наследованием Handle-ов stdin, stdout
WriteConsoleInput
FreeConsole
Я когда-то хотел написать свой telnet-сервер, но ничего не вышло, т.к. я не смог написать программу, которая бы порождала несколько дочерних процессов ОДНОВРЕМЕННО и НЕЗАВИСИМО могла бы передавать данные в stdin каждого дочернего процесса. Со stdout дочерних процессов проблема решилась CreateConsoleScreenBuffer, то есть каждый дочерний процесс писал в свой отдельный ScreenBuffer, откуда я мог получить результат работы. А вот с stdin как быть - не знал - чтобы только в нужный дочерний процесс на его stdin передать данные.
А ваш вариант подойдет для управления несколькими дочерними процесами (независимый контроль stdin и stdout) ?
P.S - пошел пробовать.Сообщение не подписано |
|
|
|