Межплатформенное перенаправление стандартного ввода и вывода порожденного процесса в собственном C/C++ (редактируют с решением),

У меня есть строковая команда, которую я хотел бы выполнить асинхронно при записи в ее вход и чтении ее вывода. Звучит легким, правильным, дьявол находится в межплатформенном. Я нацелен на и MSVC/Win32 и для gcc/Linux и очевидно хочу записать минимальный объем определенного для платформы кода. Мой google-fu привел меня к сбою, я получаю слишком много шума для своих запросов, таким образом, я запустил с того, что я знаю.

popen - хороший и легкий, ФАЙЛ возвратов*, который легко использовать везде. Но вот то, что MSDN должны сказать о _popen:

Если используется в Windows-программе, функция _popen возвращает недопустимый указатель файла, который заставляет программу прекращать отвечать неограниченно долго. _popen работает правильно в консольном приложении. Для создания Приложения Windows, которое перенаправляет ввод и вывод посмотрите Создание Дочернего процесса с Перенаправленным Вводом и выводом в Платформе SDK.

и таким образом, popen вне рассмотрения (редактирование: потому что я хотел бы, чтобы мой код работал в приложении GUI). Windows способ сделать это является, по-моему, довольно ужасным и подробным. Я мог жить с платформой определенный код икры, но я захочу, по крайней мере, чтобы код ввода-вывода был тем же. Здесь, однако, я врезался в стену между WinAPI HANDLEs и C FILE*, и int дескриптор файла. Есть ли способ "преобразовать" a HANDLE кому: FILE* или int fd или наоборот? (Google привел меня к сбою еще раз на этом, все ключевые слова, которые я попробовал, являются злоупотребившим путем),

Там лучший путь состоит в том, чтобы сделать все это с небольшим определенным для платформы кодом?

Внешние библиотеки не вне рассмотрения, однако обслуживание зависимости является болью, особенно так на нескольких платформах, таким образом, я хотел бы уменьшить зависимости. Я не нашел такую библиотеку в повышении также.


Только для справки, что работало на меня в конце. В Windows/MSVC, CreatePipe() + CreateProcess() как обрисовано в общих чертах здесь, с помощью _open_osfhandle() сопровождаемый _fdopen() добираться FILE* к вводу и выводу процесса. На Linux/GCC, ничто нового здесь, создавая pipe()s; fork() затем dup2() каналы; exec(); fdopen() на соответствующих дескрипторах файлов. Тот путь, только нерестящийся код процесса является зависимым платформы (который в порядке, поскольку в Windows I хотел бы управлять дополнительный STARTUPINFO параметры), писание входа и чтение вывода сделаны через стандарт FILE* и связанные функции.

8
задан sbk 13 January 2010 в 09:00
поделиться

2 ответа

для преобразования окон HANDLEs в дескрипторы C используйте _open_osfhandle http://msdn.microsoft.com/en-us/library/bdts1c9x%28VS.71%29.aspx

EDIT: этот пример однажды помог мне тоже с похожей проблемой: http://www.halcyon.com/~ast/dload/guicon.htm

2
ответ дан 5 December 2019 в 20:16
поделиться

Дайте libexecstream вихрь. Это кроссплатформенность, позволяющая асинхронно ловить потоки ввода, вывода и ошибок процесса, как потоки в стиле C++.

Я использовал его на Linux, Darwin и Windows и кажется, что он работает. Он также довольно легковесен, поэтому безболезненно интегрируется в проекты и имеет довольно открытую лицензию на BSD. Я не думаю, что есть какой-то способ использовать библиотеку (кроме написания собственных вариаций для каждой платформы).

6
ответ дан 5 December 2019 в 20:16
поделиться