segfaults

Lars T. Kyllingstad public at kyllingen.NOSPAMnet
Tue May 4 09:32:37 PDT 2010


On Tue, 04 May 2010 08:55:36 -0500, Ellery Newcomer wrote:
> On 05/04/2010 01:58 AM, Lars T. Kyllingstad wrote:
>> std.process is currently undergoing a complete redesign, so the current
>> situation should improve in the near future. :)
>>
>> -Lars
> 
> That's good to hear. And since you're an expert in this stuff, does this
> my code look alright?
> 
> import std.typecons;
> static import std.c.process;
> import std.functional;
> import std.stdio;
> import std.string;
> 
> alias Tuple!(ubyte, "status",ubyte, "term", ubyte,
> "sig",bool,"signaled",bool, "stopped", bool,"continued",bool,
> "coredumped") PID;
> 
> PID toPID(int p){
>      PID pid;
>      pid.status = cast(byte)((p & 0xff00) >> 8); pid.term = cast(byte)(p
>      & 0xff);
>      pid.sig = cast(byte)(p & 0x7f);
>      pid.signaled = pid.sig != 0 && pid.sig != 0x7f; pid.coredumped =
>      cast(bool)(p & 0x80); pid.stopped = pid.term == 0x7f;
>      pid.continued = p == 0xffff;
>      return pid;
> }

Shouldn't 'term' and 'signaled' switch names?  It looks to me like 'term' 
will be nonzero if the process receives any signal, while 'signaled' will 
be only be true if it is a terminating signal, and not if it is a stop 
signal.

Otherwise it looks right, at least on Linux.  But why not use the 
core.sys.posix.sys.wait.Wxxx() functions?  Then it will automatically 
work on BSD and MacOS as well.

 
> int fromPID(PID pid){
>      if(pid.signaled) return pid.term;
>      return pid.status;
> }
> 
> alias compose!(toPID, std.c.process.system, toStringz) system_p; alias
> compose!(fromPID, system_p) system;

I didn't know about compose, that's nifty. :)

-Lars


More information about the Digitalmars-d-learn mailing list