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

Reply via email to