Posix-Exec-подобная передача консольных ручек для ребенка CreateProcessC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Posix-Exec-подобная передача консольных ручек для ребенка CreateProcess

Сообщение Anonymous »

С Visual Studio 2015 на Windows 11 я пытаюсь реализовать тонкую обертку C ++ вокруг определенных утилит, такую как Python, которая выполняет некоторые проверки среды/пути/конфигурации, прежде чем, наконец, запустить утилиту. /> Требование: не открывает новое окно консоли,
предпочтительнее: не теряет цикл ЦП, переасывающая stdio через трубы в руку,
non-conderation: универсальные приложения < /p>
Использование простого запуска Createprocess: < /p>
.

Код: Выделить всё

    // Grab current console handles so we can forward them
HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE);
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE hStdErr = GetStdHandle(STD_ERROR_HANDLE);

// Setup process creation
STARTUPINFOA si = {};
si.cb = sizeof(si);
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdInput = hStdIn;
si.hStdOutput = hStdOut;
si.hStdError = hStdErr;

// Disable Ctrl-C, let the child handle it.

// Ensure our io activities are finished
_flushall();

// Create the child process in a new process group
BOOL success = CreateProcessA(
nullptr,                    // No module name (use command line)
const_cast(cmdline.c_str()), // Command line
nullptr,                    // Process handle not inheritable
nullptr,                    // Thread handle not inheritable
1,                          // Set handle inheritance to TRUE
0,                          // Creation flags - normal priority
nullptr,                    // Use parent's environment block
nullptr,                    // Use parent's starting directory
&si,                        // Pointer to STARTUPINFO structure
gProcessInfo                // Pointer to PROCESS_INFORMATION structure
);

if (!success) return -1;

// The child is responsible for ctrl-c as of now.
SetConsoleCtrlHandler(consoleCtrlHandler, TRUE);
Ребенок запускает, как и ожидалось, и если я использую его для запуска Python, то Os.isatty (n) печатает True/false соответственно, но Python, похоже, получает свою собственную дискретную консоль .

Код: Выделить всё

> python
3.12.10
>>> os.isatty(0)
True
>>> # 
против < /p>
> mywrapper python
3.12.10
>>> os.isatty(0)
True
>>> ^[[A  # 
С одной стороны, я отмечаю < /p>
> python -c 'import os; os.system("python")'
3.12.10
>>> os.isatty(0)
True
>>> ^[[A  # 

Подробнее здесь: [url]https://stackoverflow.com/questions/79696425/posix-exec-like-transfer-of-console-handles-to-createprocess-child[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»