Win32/process question

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

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

Hi,

On Windows XP, Ruby 1.8.5:

kill notepad

Refer to 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.

On 11/10/06, Park H. [email protected] 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

Hi,

From: J-Van [email protected]
Reply-To: [email protected]
To: [email protected] (ruby-talk ML)
Subject: Re: win32/process question
Date: Sat, 11 Nov 2006 03:24:34 +0900

On 11/10/06, Park H. [email protected] 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.

On 11/10/06, Park H. [email protected] 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

On 11/10/06, Park H. [email protected] 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

From: J-Van [email protected]
Reply-To: [email protected]
To: [email protected] (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.

On 11/10/06, Park H. [email protected] 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. :slight_smile:

Joe