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