# Win32/process question

**URL:** <https://www.ruby-forum.com/t/win32-process-question/75479>\
**Category:** Ruby\
**Created:** [November 10, 2006, 6:55am UTC](https://www.ruby-forum.com/t/win32-process-question/75479 "2006-11-10T06:55:23Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![J-Van](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/bc8723/32.png) [@J-Van](https://www.ruby-forum.com/u/J-Van)\
**Post date:** [November 10, 2006, 6:55am UTC](https://www.ruby-forum.com/t/win32-process-question/75479/1 "2006-11-10T06:55:23Z")

</div>

On Windows XP, Ruby 1.8.5:

# start notepad

irb(main):003:0\> info = Process.create :app\_name =\> “notepad”  
=\> #

# notepad running

irb(main):004:0\> Process.kill 0, info.process\_id  
=\> [3536]

# kill notepad

irb(main):005:0\> Process.kill 9, info.process\_id  
=\> [3536]

# notepad’s dead, but why doesn’t this throw an exception?!

irb(main):006:0\> Process.kill 0, info.process\_id  
=\> [3536]

Any ideas?  
Thanks,  
Joe

---

<div class="post-metadata">

**Author:** ![J-Van](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/bc8723/32.png) [@J-Van](https://www.ruby-forum.com/u/J-Van)\
**Post date:** [November 10, 2006, 7:47am UTC](https://www.ruby-forum.com/t/win32-process-question/75479/2 "2006-11-10T07:47:25Z")

</div>

I guess I should note that this is after I require ‘win32/process’  
(which is installed via a gem).

---

<div class="post-metadata">

**Author:** ![J-Van](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/bc8723/32.png) [@J-Van](https://www.ruby-forum.com/u/J-Van)\
**Post date:** [November 10, 2006, 11:29am UTC](https://www.ruby-forum.com/t/win32-process-question/75479/3 "2006-11-10T11:29:51Z")

</div>

Hi,

> > On Windows XP, Ruby 1.8.5:
> > 
> > # kill notepad

Refer to [http://msdn2.microsoft.com/fr-fr/library/ms686722.aspx](http://msdn2.microsoft.com/fr-fr/library/ms686722.aspx),  
“While open handles to kernel objets are closed automatically when a  
process  
terminates, the objects themselves exist until all open handles to them  
are  
closed. Therefore, an object will remain valid after a process that is  
using  
it terminates if another process has an open handle to it.”

Here is the working code.

irb(main):001:0\> require ‘win32/process’  
=\> true  
irb(main):002:0\> include Windows::Handle  
=\> Object  
irb(main):003:0\> info = Process.create :app\_name=\>‘notepad’  
=\> #  
irb(main):004:0\> Process.kill 0,info.process\_id  
=\> [1748]  
irb(main):005:0\> Process.kill 9,info.process\_id  
=\> [1748]  
irb(main):006:0\> CloseHandle(info.process\_handle)  
=\> true  
irb(main):007:0\> CloseHandle(info.thread\_handle)  
=\> true  
irb(main):008:0\> Process.kill 0,info.process\_id  
ProcessError: The parameter is incorrect.  
from  
c:/ruby/lib/ruby/gems/1.8/gems/win32-process-0.5.1/lib/win32/proces  
s.rb:156:in `kill' from c:/ruby/lib/ruby/gems/1.8/gems/win32-process-0.5.1/lib/win32/proces s.rb:132:in `each’  
from  
c:/ruby/lib/ruby/gems/1.8/gems/win32-process-0.5.1/lib/win32/proces  
s.rb:132:in `kill’  
from (irb):8

Regards,

Park H.

---

<div class="post-metadata">

**Author:** ![J-Van](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/bc8723/32.png) [@J-Van](https://www.ruby-forum.com/u/J-Van)\
**Post date:** [November 10, 2006, 7:25pm UTC](https://www.ruby-forum.com/t/win32-process-question/75479/4 "2006-11-10T19:25:08Z")

</div>

On 11/10/06, Park H. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > (which is installed via a gem).
> > 
> > > irb(main):004:0\> Process.kill 0, info.process\_id  
> > > Any ideas?  
> > > Here is the working code.  
> > > =\> [1748]  
> > > s.rb:156:in `kill' from c:/ruby/lib/ruby/gems/1.8/gems/win32-process-0.5.1/lib/win32/proces s.rb:132:in `each’  
> > > from  
> > > c:/ruby/lib/ruby/gems/1.8/gems/win32-process-0.5.1/lib/win32/proces  
> > > s.rb:132:in `kill’  
> > > from (irb):8

So, if I use Process.create to create a new process, and I want to  
know when a user closed the program, I should close the handle to the  
process immediately after starting it? And then Process.kill(0,  
) would return an exception once the user closed the program?

Joe

---

<div class="post-metadata">

**Author:** ![J-Van](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/bc8723/32.png) [@J-Van](https://www.ruby-forum.com/u/J-Van)\
**Post date:** [November 11, 2006, 1:19am UTC](https://www.ruby-forum.com/t/win32-process-question/75479/5 "2006-11-11T01:19:57Z")

</div>

Hi,

> From: J-Van [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
> Reply-To: removed\_email\_address@domain.invalid  
> To: removed\_email\_address@domain.invalid (ruby-talk ML)  
> Subject: Re: win32/process question  
> Date: Sat, 11 Nov 2006 03:24:34 +0900
> 
> On 11/10/06, Park H. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:
> 
> > Hi,

…

> > Here is the working code.  
> > =\> [1748]  
> > s.rb:156:in `kill’  
> > process immediately after starting it? And then Process.kill(0,  
> > ) would return an exception once the user closed the program?
> 
> Joe

You cannot close the hanle if the process is still alive. You can use  
WaitForSingleObject or Process.waitpid to wait until child process exits  
like this:

require ‘win32/process’  
include Windows::Handle  
info = Process.create :app\_name=\>‘notepad’  
Process.waitpid(info.process\_id)  
CloseHandle(info.process\_handle)  
CloseHandle(info.thread\_handle)

Regards,

Park H.

---

<div class="post-metadata">

**Author:** ![J-Van](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/bc8723/32.png) [@J-Van](https://www.ruby-forum.com/u/J-Van)\
**Post date:** [November 11, 2006, 1:29am UTC](https://www.ruby-forum.com/t/win32-process-question/75479/6 "2006-11-11T01:29:58Z")

</div>

On 11/10/06, Park H. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > > using  
> > > process  
> > > ProcessError: The parameter is incorrect.
> 
> require ‘win32/process’  
> include Windows::Handle  
> info = Process.create :app\_name=\>‘notepad’  
> Process.waitpid(info.process\_id)  
> CloseHandle(info.process\_handle)  
> CloseHandle(info.thread\_handle)

If I use Process.waitpid in a thread, all the other threads seem to  
block until the process that I’m waiting for stops.

I’m writing a program that runs on a windows machine that listens for  
requests to start and kill programs. It needs to be able to run and  
kill multiple programs and needs to be able to monitor the programs  
that it has started to make sure that they are still running. If  
Process.waitpid makes the whole Ruby process hang, that’s no good.

Joe

---

<div class="post-metadata">

**Author:** ![J-Van](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/bc8723/32.png) [@J-Van](https://www.ruby-forum.com/u/J-Van)\
**Post date:** [November 10, 2006, 7:23pm UTC](https://www.ruby-forum.com/t/win32-process-question/75479/7 "2006-11-10T19:23:07Z")

</div>

On 11/10/06, Park H. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > (which is installed via a gem).
> > 
> > > irb(main):004:0\> Process.kill 0, info.process\_id  
> > > Any ideas?  
> > > Here is the working code.  
> > > =\> [1748]  
> > > s.rb:156:in `kill' from c:/ruby/lib/ruby/gems/1.8/gems/win32-process-0.5.1/lib/win32/proces s.rb:132:in `each’  
> > > from  
> > > c:/ruby/lib/ruby/gems/1.8/gems/win32-process-0.5.1/lib/win32/proces  
> > > s.rb:132:in `kill’  
> > > from (irb):8

Fantastic, thanks!

Joe

---

<div class="post-metadata">

**Author:** ![J-Van](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/bc8723/32.png) [@J-Van](https://www.ruby-forum.com/u/J-Van)\
**Post date:** [November 11, 2006, 2:08am UTC](https://www.ruby-forum.com/t/win32-process-question/75479/8 "2006-11-11T02:08:03Z")

</div>

> From: J-Van [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
> Reply-To: removed\_email\_address@domain.invalid  
> To: removed\_email\_address@domain.invalid (ruby-talk ML)  
> Subject: Re: win32/process question  
> Date: Sat, 11 Nov 2006 09:29:10 +0900

…

> Joe

If you don’t want blocking, try WaitForSingleObect like this:

require ‘win32/process’  
include Windows::Handle  
include Windows::Synchronize

info = Process.create :app\_name=\>‘notepad’

begin  
i = WaitForSingleObject(info.process\_handle,10)  
if i==WAIT\_OBJECT\_0  
CloseHandle(info.process\_handle)  
CloseHandle(info.thread\_handle)  
end

# do something

end while i==WAIT\_TIMEOUT

Regards,

Park H.

---

<div class="post-metadata">

**Author:** ![J-Van](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/bc8723/32.png) [@J-Van](https://www.ruby-forum.com/u/J-Van)\
**Post date:** [November 11, 2006, 2:30am UTC](https://www.ruby-forum.com/t/win32-process-question/75479/9 "2006-11-11T02:30:09Z")

</div>

On 11/10/06, Park H. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > 
> 
> require ‘win32/process’  
> end
> 
> # do something
> 
> end while i==WAIT\_TIMEOUT

Thanks – I’ll try that. I’m not exactly sure what those functions do  
though. 🙂

Joe
