У меня есть строковая команда, которую я хотел бы выполнить асинхронно при записи в ее вход и чтении ее вывода. Звучит легким, правильным, дьявол находится в межплатформенном. Я нацелен на и MSVC/Win32 и для gcc/Linux и очевидно хочу записать минимальный объем определенного для платформы кода. Мой google-fu привел меня к сбою, я получаю слишком много шума для своих запросов, таким образом, я запустил с того, что я знаю.
popen - хороший и легкий, ФАЙЛ возвратов*, который легко использовать везде. Но вот то, что MSDN должны сказать о _popen:
Если используется в Windows-программе, функция _popen возвращает недопустимый указатель файла, который заставляет программу прекращать отвечать неограниченно долго. _popen работает правильно в консольном приложении. Для создания Приложения Windows, которое перенаправляет ввод и вывод посмотрите Создание Дочернего процесса с Перенаправленным Вводом и выводом в Платформе SDK.
и таким образом, popen вне рассмотрения (редактирование: потому что я хотел бы, чтобы мой код работал в приложении GUI). Windows способ сделать это является, по-моему, довольно ужасным и подробным. Я мог жить с платформой определенный код икры, но я захочу, по крайней мере, чтобы код ввода-вывода был тем же. Здесь, однако, я врезался в стену между WinAPI HANDLE
s и 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*
и связанные функции.
для преобразования окон HANDLE
s в дескрипторы C используйте _open_osfhandle
http://msdn.microsoft.com/en-us/library/bdts1c9x%28VS.71%29.aspx
EDIT: этот пример однажды помог мне тоже с похожей проблемой: http://www.halcyon.com/~ast/dload/guicon.htm
Дайте libexecstream вихрь. Это кроссплатформенность, позволяющая асинхронно ловить потоки ввода, вывода и ошибок процесса, как потоки в стиле C++.
Я использовал его на Linux, Darwin и Windows и кажется, что он работает. Он также довольно легковесен, поэтому безболезненно интегрируется в проекты и имеет довольно открытую лицензию на BSD. Я не думаю, что есть какой-то способ использовать библиотеку (кроме написания собственных вариаций для каждой платформы).