[fpc-pascal]how to find out if a TProcess was killed

Michael Van Canneyt michael.vancanneyt at wisa.be
Tue May 27 14:17:02 CEST 2003


On Tue, 27 May 2003, Mattias Gaertner wrote:

> Hi,
>
> If I start a TProcess and the process is being killed by the system (for
> example, because it runs amok and allocates too much mem) the ExitStatus is
> 0. How can I find out, that the program was killed?

The exit status are the high bits of a word describing
how a process exited.  The Wifsignaled function tells you whether the
process was signaled, and wtermsig tells you what signal caused the
exit. TProcess (being cross-platform) doesn't support this.

Here are the relevant functions (unit unix, 1.1 branch):

function WEXITSTATUS(Status: Integer): Integer;
begin
  WEXITSTATUS:=(Status and $FF00) shr 8;
end;

function WTERMSIG(Status: Integer): Integer;
begin
  WTERMSIG:=(Status and $7F);
end;

function WSTOPSIG(Status: Integer): Integer;
begin
  WSTOPSIG:=WEXITSTATUS(Status);
end;

Function WIFEXITED(Status: Integer): Boolean;
begin
  WIFEXITED:=(WTERMSIG(Status)=0);
end;

Function WIFSTOPPED(Status: Integer): Boolean;
begin
  WIFSTOPPED:=((Status and $FF)=$7F);
end;

Function WIFSIGNALED(Status: Integer): Boolean;
begin
  WIFSIGNALED:=(not WIFSTOPPED(Status)) and
               (not WIFEXITED(Status));
end;

Function W_EXITCODE(ReturnCode, Signal: Integer): Integer;
begin
  W_EXITCODE:=(ReturnCode shl 8) or Signal;
end;

Function W_STOPCODE(Signal: Integer): Integer;

begin
  W_STOPCODE:=(Signal shl 8) or $7F;
end;

If you have suggestions for adding support for these functions
to TProcess, let me know.

Michael.





More information about the fpc-pascal mailing list