запустить exe / процесс с помощью stdin stdout и stderr?


С помощью C++ как запустить exe / процесс с помощью stdin stdout и stderr? Я знаю, как это сделать в .NET, и я помню, что использовал popen в прошлом, но popen, кажется, позволяет stdin или stdout не оба и не все 3.

Мне это нужно для windows, но решение linux приветствуется, так как оно понадобится мне для того же проекта в будущем.

4 9

4 ответа:

Вы должны использовать CreateProcess из WinApi. Он принимает в качестве аргумента объект типа struct STARTUP_INFO. Можно задать поля hstdin, hStdout и hStderr объекта для перенаправления потоков дочернего процесса на дескрипторы файлов, которые вы хотите (файл, канал, сокет...)

У меня были проблемы с порождением процессов и чтением или записью в их поток, но затем я обнаружил большую библиотеку C++, которая является очень удобной.

Этот проект с открытым исходным кодом называется библиотека крошечных процессов и был создан эйдхайм (большое ему спасибо).

Небольшая независимая от платформы библиотека, упрощающая создание и остановка новых процессов в C++, а также запись в stdin и чтение от stdout и stderr нового процесса.

Особенности

  • никаких внешних зависимостей
  • Простой в использовании
  • платформа независимая
  • читать отдельно от stout и stderr, используя анонимные функции
  • напишите в stdin
  • убить запущенный процесс (SIGTERM поддерживается в Unix-подобных системах)
  • корректно закрывает файловые дескрипторы / дескрипторы

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

Портативным решением будет boost.процесс

(Примечание: эта библиотека была предложена в качестве библиотеки Boost и выпущена на тех же условиях лицензии, но официально не принята. См. также , где повысить.Процесс?)