static VALUE t_get_subprocess_status (VALUE self, VALUE signature)
{
    VALUE proc_status = Qnil;

    int status;
    pid_t pid;

    if (evma_get_subprocess_status (NUM2ULONG (signature), &status)) {
        if (evma_get_subprocess_pid (NUM2ULONG (signature), &pid)) {
            proc_status = rb_obj_alloc(rb_cProcStatus);

            /* MRI Ruby uses hidden instance vars */
            rb_iv_set(proc_status, "status", INT2FIX(status));
            rb_iv_set(proc_status, "pid", INT2FIX(pid));

#ifdef RUBINIUS
            /* Rubinius uses standard instance vars */
            rb_iv_set(proc_status, "@pid", INT2FIX(pid));
            if (WIFEXITED(status)) {
                rb_iv_set(proc_status, "@status", INT2FIX(WEXITSTATUS(status)));
            } else if(WIFSIGNALED(status)) {
                rb_iv_set(proc_status, "@termsig", INT2FIX(WTERMSIG(status)));
            } else if(WIFSTOPPED(status)) {
                rb_iv_set(proc_status, "@stopsig", INT2FIX(WSTOPSIG(status)));
            }
#endif
        }
    }

    return proc_status;
}
static VALUE t_get_subprocess_pid (VALUE self, VALUE signature)
{
    pid_t pid;
    if (evma_get_subprocess_pid (NUM2ULONG (signature), &pid)) {
        return INT2NUM (pid);
    }

    return Qnil;
}
static VALUE t_get_subprocess_status (VALUE self, VALUE signature)
{
	VALUE proc_status = Qnil;

	int status;
	pid_t pid;

	if (evma_get_subprocess_status (NUM2ULONG (signature), &status)) {
		if (evma_get_subprocess_pid (NUM2ULONG (signature), &pid)) {
			proc_status = rb_obj_alloc(rb_cProcStatus);
			rb_iv_set(proc_status, "status", INT2FIX(status));
			rb_iv_set(proc_status, "pid", INT2FIX(pid));
		}
	}

	return proc_status;
}