|
19 / 19 / 7
Регистрация: 17.05.2013
Сообщений: 72
|
||||||
Передача считанного файла через pipe11.10.2013, 17:30. Показов 8284. Ответов 32
Метки нет (Все метки)
прошу помощи разобраться с чтением файла и передачей прочитанных данных через анонимный pipe
сам смысл задачи:программа запускается из консоли с двумя аргументами - стандартная команда из cmd и имя файла, в которой хранятся входные данные для самой команды.. пока застрял на осознании как работать с каналами в winapi.. в unix, ИМХО, проще как то.. есть набросок кода, но я не удивлюсь, если я там и близко не подошел к поставленной задаче.. собственно как исправить это чудовище, чтобы появилась возможность считанные данные запихать в новый процесс?
0
|
||||||
| 11.10.2013, 17:30 | |
|
Ответы с готовыми решениями:
32
Передача системного времени через pipe
|
|
Ушел с форума
|
|
| 11.10.2013, 18:19 | |
|
0
|
|
|
19 / 19 / 7
Регистрация: 17.05.2013
Сообщений: 72
|
|
| 11.10.2013, 18:28 [ТС] | |
|
Убежденный, в родительском процессе создается дочерний, в котором выполняется программа принятая в качестве аргумента основной программой (не знаю как более правильно и красиво сказать сказать). так вот через pipe надо передать считанные данные из файла в дочерний процесс, что бы тот, начал их обработку.. как то так
0
|
|
|
Ушел с форума
|
|||
| 11.10.2013, 18:40 | |||
|
Ну тогда Вам стоит для начала почитать про наследование хэндлов из одного процесса в другой: Handle Inheritance http://msdn.microsoft.com/en-u... s.85).aspx Inheritance http://msdn.microsoft.com/en-u... s.85).aspx В общем случае, последовательность действий примерно такова - сначала создается объект с параметром "inherited = true", затем его хэндл прокидывается в создаваемый процесс, например через командную строку или через STARTUPINFO. Вот здесь есть пример такого взаимодействия: Creating a Child Process with Redirected Input and Output http://msdn.microsoft.com/en-u... s.85).aspx Когда будете писать, внимательнейшим образом сверяйтесь с документацией, потому что в работе некоторых функций могут быть малозаметные при беглом чтении, но очень важные детали. Например, в приведенном выше коде функция CreateProcess может свалить всю программу в access violation (предлагаю в качестве упражнения выяснить, почему именно).
1
|
|||
|
19 / 19 / 7
Регистрация: 17.05.2013
Сообщений: 72
|
|
| 11.10.2013, 18:48 [ТС] | |
|
novi4ok, анонимный выбрал, потому что в именованном нужды нет.. поэтому сделал приоритет пока в него, чтобы разобраться сначала с ним, потом уже с именнованным
0
|
|
|
19 / 19 / 7
Регистрация: 17.05.2013
Сообщений: 72
|
||||||
| 12.10.2013, 01:22 [ТС] | ||||||
|
код набирает объем, а передать через канал данные из файла другому процессу не получается..
З.Ы. может я неправильно как то понимаю, как можно по-другому перенаправить данные с файла в стандартный ввод дочернего процесса? ![]() Добавлено через 2 часа 40 минут PS Убежденный, в вашей последней ссылке именно тот код, который мне нужен был.. точнее он работает так, как хотел бы я.. не могли бы вы мне объяснить ситуацию с двумя каналами? почему там используются два канала и почему нельзя было через 1 как нибудь сделать, как пытался сделать я.. ну и на выше стоящие вопросы если бы хоть кто нибудь ответил, было бы неплохо, заранее благодарю)
0
|
||||||
|
19 / 19 / 7
Регистрация: 17.05.2013
Сообщений: 72
|
|
| 14.10.2013, 14:28 [ТС] | |
|
как-нибудь можно в ReadFile() заменить буфер на handle, скажем, стандартного вывода? чтобы обойтись без writefile.. если да, то как?
0
|
|
|
Ушел с форума
|
||||
| 14.10.2013, 14:54 | ||||
|
Создал пайп, передал хэндл в дочерний процесс и пиши-читай. Это вообще как так ?
0
|
||||
|
19 / 19 / 7
Регистрация: 17.05.2013
Сообщений: 72
|
|
| 14.10.2013, 16:33 [ТС] | |
|
Убежденный, ну собственно сказали, если поиграться с каналами, то в этой программке можно обойтись как то без writeFile.. человек, который мне это сказал, даже сделал подсказку, что рыть надо в сторону _dup2.. но при попытке связать скажем g_hChildStd_OUT_Wr или g_hChildStd_OUT_Rd с HANDLE_STD_OUTPUT программа во время работы вылетает..
какая то путаница у меня пока..
0
|
|
|
Ушел с форума
|
||
| 14.10.2013, 16:41 | ||
|
программировании пайпов, о наследовании хэндлов... Того же А. Побегайло, например ("Системное программирование в Windows"). И еще. Чего Вы хотите добиться ? Передать команду в дочерний процесс, все-таки, или "обойтись без WriteFile" ?
0
|
||
|
19 / 19 / 7
Регистрация: 17.05.2013
Сообщений: 72
|
||
| 14.10.2013, 17:09 [ТС] | ||
|
0
|
||
|
Ушел с форума
|
|
| 14.10.2013, 17:50 | |
|
0
|
|
|
19 / 19 / 7
Регистрация: 17.05.2013
Сообщений: 72
|
||||||
| 14.10.2013, 19:24 [ТС] | ||||||
|
Убежденный,
Кликните здесь для просмотра всего текста
вот пока тот код, что у меня есть и работает.. в нем всего два раза используется WriteFile.. Первый раз когда мы записываем в канал отправляющий данные дочернему процессу, второй раз когда принимаем в родительский процесс обратно результат.. вот эти оба writefile надо как то избежать, используя _dup2 и перенаправление потоков ввода/вывода
0
|
||||||
|
Ушел с форума
|
||
| 15.10.2013, 08:59 | ||
|
Пример из MSDN использует два пайпа, потому что работает с однонаправленными стандартными потоками (stdin и stdout) и их редиректом. То есть, он пишет через stdin в дочерний процесс, а читает из него через stdout, причем дочерний процесс никакой подмены "не видит" и по-прежнему использует std::cin/std::cout. Но ничто не мешает создать пайп, передать его хэндл в дочерний процесс, а затем писать и читать в пайп, используя оба конца. Однако в любом случае I/O-операций будет, как минимум, две: передача данных дочернему процессу и прием ответа от него.
1
|
||
|
19 / 19 / 7
Регистрация: 17.05.2013
Сообщений: 72
|
|
| 15.10.2013, 22:21 [ТС] | |
|
Убежденный, эта теория вся прекрасна, конечно.. но я хотел бы знать еще как работать с _dup2? у него прототип int _dup2(int,int).. передать HANDLE в качестве аргумента, как я понимаю, не получится.. при явном приведении происходит краш программы
0
|
|
|
Ушел с форума
|
|
| 15.10.2013, 23:50 | |
|
DuplicateHandle(Ex).
0
|
|
|
19 / 19 / 7
Регистрация: 17.05.2013
Сообщений: 72
|
|
| 16.10.2013, 12:59 [ТС] | |
|
а как это должно помочь? мне надо как то привести дескриптор handle к типу int.. а эта функция, насколько я знаю, просто копирует одному handle другой дескриптор со всеми его свойствами.. в результате остается все тот же handle..
З.Ы. видел образец программы на UNIX. и я теперь уверен, что дело осталось за малым.. просто понять как использовать _dup2(int,int).. на msdn не нашел примера использования совместно с HANDLE
0
|
|
|
Ушел с форума
|
|
| 16.10.2013, 13:35 | |
|
_dup2 работает с файловыми дескрипторами стандартной библиотеки C/C++.
А DuplicateHandle(Ex) - с HANDLE из Win32 API, это немного разные вещи (хотя сводится все в конечном счете к HANDLE). Но Вы можете более четко описать, чего именно требуется достичь с помощью пайпов ? Передача данных туда-сюда, как видим, работает, чего же не хватает ? Для чего нужно избавляться от WriteFile ?
0
|
|
| 16.10.2013, 13:35 | |
|
Помогаю со студенческими работами здесь
20
Интегрирование полинома, считанного из файла Заполнить массив цифрами числа, считанного через cin
Передача данных между процессами (pipe) Передача данных между консолью с использованием Pipe Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes.
А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения
развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам
Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
|
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|