On 2024-09-25 16:33, Thiago Macieira wrote:
On Wednesday 25 September 2024 06:17:11 GMT-7 christ...@cullmann.io
wrote:
Hi,
I want to ensure only the standard handles are inherited.
Hello Cristoph
Hi Thiago,
thanks for the fast response!
For Unix this seems to work fine with:
QProcess::UnixProcessParameters params;
params.flags = QProcess::UnixProcessFlag::CloseFileDescriptors;
params.lowestFileDescriptorToClose = 0;
m_process.setUnixProcessParameters(params);
m_process.start(....
lowestFileDescriptorToClose defaults to 0, so you don't have to set it.
If
you're going to set, I expect you to set it to something higher than
STDERR_FILENO + 1 (which is the minimum), for whatever your need is.
You are right, I could have kept the default, like promised in the docs
even
with the 0 the standard handles survive and the normal Qt QProcess
read/... stuff
works like intended.
For Windows I tried something like:
https://devblogs.microsoft.com/oldnewthing/20111216-00/?p=8873
via: (the UR_ENSURE stuff just checks if return value is sane)
STARTUPINFOEX info;
ZeroMemory(&info, sizeof(info));
m_process.setCreateProcessArgumentsModifier([&info](QProcess::CreateProcessA
rguments *args) {
...
args->startupInfo = &info.StartupInfo;
You don't need to pass your own startupInfo here. At least you made
sure it's
valid around the CreateProcess call, so no dangling pointer, which was
my first
worry. But args should have a valid startupInfo pointer you can modify.
You are right, there is a valid startupInfo, but that is no
STARTUPINFOEX struct
and only that one allows to have the explicit list of handles to inherit
that
I tried to use. (at least if I didn't read the types wrong)
});
m_process.start(....
But with that I end up without any valid handles that can be used to
get
output from the QProcess m_process.
Any pointers how to do that correctly would be very welcome. (or if I
just missed to used the proper Qt API for that)
Since you want no handles but the standard three, would setting
args->inheritHandles = false
suffice?
I tried that but for me that fails, I have no handles and unlike on
Linux
or Mac with the other code path I can no longer read any output from the
QProcess.
I did read a bit the Windows docs and the Qt code and its seems
inheritHandles = TRUE
is required if you use the STARTF_USESTDHANDLES flag in the startup info
like Qt does.
https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/ns-processthreadsapi-startupinfoa
Greetings
Christoph
_______________________________________________
Interest mailing list
Interest@qt-project.org
https://lists.qt-project.org/listinfo/interest
_______________________________________________
Interest mailing list
Interest@qt-project.org
https://lists.qt-project.org/listinfo/interest