# Setting $? manually - possible?

**URL:** <https://www.ruby-forum.com/t/setting-manually-possible/59482>\
**Category:** Ruby\
**Created:** [May 3, 2006, 7:08pm UTC](https://www.ruby-forum.com/t/setting-manually-possible/59482 "2006-05-03T19:08:35Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![danielb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/c57346/32.png) [@danielb](https://www.ruby-forum.com/u/danielb)\
**Post date:** [May 3, 2006, 7:08pm UTC](https://www.ruby-forum.com/t/setting-manually-possible/59482/1 "2006-05-03T19:08:35Z")

</div>

Hi all,

Ruby 1.8.4

I’m working on a custom Process.waitpid method (for Windows). It works  
fine, except that I want to be able to set the Process::Status ($?)  
manually within the method. Specifically, the exitstatus and pid. This  
is pure Ruby, btw.

The problem is that Process::Status.new has been undef’d within  
process.c and $? has been set to readonly.

I’ve tinkered with redefining Process::Status.new, a custom  
Process::Status#initialize, instance\_variable\_set, etc - all to no  
avail.

Is there any way to set $? from within Ruby?

Thanks,

Dan

---

<div class="post-metadata">

**Author:** ![danielb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/c57346/32.png) [@danielb](https://www.ruby-forum.com/u/danielb)\
**Post date:** [May 3, 2006, 7:10pm UTC](https://www.ruby-forum.com/t/setting-manually-possible/59482/2 "2006-05-03T19:10:49Z")

</div>

Hi,

> I’m working on a custom Process.waitpid method (for Windows). It works  
> Is there any way to set $? from within Ruby?

Something like this is possible but not recommended.

require ‘Win32API’

FIXNUM\_FLAG = 0x01  
rb\_int2inum = Win32API.new(‘msvcrt-ruby18’,‘rb\_int2inum’,‘L’,‘L’) # long  
-\>  
VALUE  
rb\_iv\_set = Win32API.new(‘msvcrt-ruby18’, ‘rb\_iv\_set’, ‘LPL’, ‘V’)

```
system("ver")

```

p $? # -\> #\<Process::Status: pid=920,exited(0)\>  
obj = rb\_int2inum.call($?.object\_id) ^ FIXNUM\_FLAG  
rb\_iv\_set.call(obj,“pid”,rb\_int2inum.call(1))  
rb\_iv\_set.call(obj,“status”,rb\_int2inum.call(0xFF00))  
p $? # -\> #\<Process::Status: pid=1,exited(255)\>

Regards,  
Park H.

---

<div class="post-metadata">

**Author:** ![danielb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/c57346/32.png) [@danielb](https://www.ruby-forum.com/u/danielb)\
**Post date:** [August 3, 2006, 1:33pm UTC](https://www.ruby-forum.com/t/setting-manually-possible/59482/3 "2006-08-03T13:33:49Z")

</div>

Park H. wrote:

> > Hi all,
> 
> rb\_int2inum = Win32API.new(‘msvcrt-ruby18’,‘rb\_int2inum’,‘L’,‘L’) # long  
> -\> VALUE  
> rb\_iv\_set = Win32API.new(‘msvcrt-ruby18’, ‘rb\_iv\_set’, ‘LPL’, ‘V’)
> 
> system(“ver”)  
> p $? # -\> #\<Process::Status: pid=920,exited(0)\>  
> obj = rb\_int2inum.call($?.object\_id) ^ FIXNUM\_FLAG  
> rb\_iv\_set.call(obj,“pid”,rb\_int2inum.call(1))  
> rb\_iv\_set.call(obj,“status”,rb\_int2inum.call(0xFF00))  
> p $? # -\> #\<Process::Status: pid=1,exited(255)\>

Heh, that’s awesome. I may just add that, though I’ll toss in some  
error checking and extra documentation. 🙂

Thanks,

Dan
