Ticket #3994 (closed feature request: fixed)
Add support for creating and interrupting process groups
|Reported by:||hamish||Owned by:||simonmar|
|Type of failure:||None/Unknown||Difficulty:|
|Test Case:||Blocked By:|
This patch introduces the following to System.Process
This Bool field is added to CreateProcess?. If it is set to True the child process will be created as the lead process in a new process group.
- Unix - calls setpgid in both the parent and the child process after fork.
- Win32 - calls CreateProcess? with the CREATE_NEW_PROCESS_GROUP set. I also had it unset CREATE_NO_WINDOW because this seems to prevent the child attaching to the parents console (and therefor stops interuptProcessGroup from working).
This function can be used interrupt a running process group.
- Unix - calls signalProcessGroup to send sigINT
- Win32 - If the process ID is known it calls generateConsoleCtrlEvent to send cTRL_BREAK_EVENT
CreateProcess? has a new field new_group which may need to be added to some existing code. If set to False the current behaviour is preserved. As far as I know this is the only change that could break existing code.
I have renamed the C functions it used in order to prevent linker errors when using this new version with the existing process package.
On Win32 the process handle is not the same as the process ID and there is no reliable way to convert from one to the other. I have added an interface that allows access to the process ID, but does not change the behaviour of the existing functions.
Replaces PHANDLE in the ProcessHandle? type.
type PINFO = (PHANDLE, Maybe Word32) -- Handle and Process ID
Like mkProcessHandle but allows you to specify the processes ID as well. This function is now used in the run* functions and createProcess, so the ProcessHandle? they return will contain a process ID.
withProcessInfo and withProcessInfo_
Like withProcessHandle functions but gives you access to the PINFO (not just the PHANDLE it contains).