Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > win32/process question

Reply
Thread Tools

win32/process question

 
 
J-Van
Guest
Posts: n/a
 
      11-10-2006
On Windows XP, Ruby 1.8.5:

# start notepad
irb(main):003:0> info = Process.create :app_name => "notepad"
=> #<struct Struct:rocessInfo process_handle=1916,
thread_handle=1912, process_id=3536, thread_id=3088>

# 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

 
Reply With Quote
 
 
 
 
J-Van
Guest
Posts: n/a
 
      11-10-2006
I guess I should note that this is after I require 'win32/process'
(which is installed via a gem).

On 11/9/06, J-Van <> wrote:
> On Windows XP, Ruby 1.8.5:
>
> # start notepad
> irb(main):003:0> info = Process.create :app_name => "notepad"
> => #<struct Struct:rocessInfo process_handle=1916,
> thread_handle=1912, process_id=3536, thread_id=3088>
>
> # 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
>


 
Reply With Quote
 
 
 
 
Park Heesob
Guest
Posts: n/a
 
      11-10-2006

Hi,

>From: J-Van <>
>Reply-To: ruby-
>To: ruby- (ruby-talk ML)
>Subject: Re: win32/process question
>Date: Fri, 10 Nov 2006 15:23:58 +0900
>
>I guess I should note that this is after I require 'win32/process'
>(which is installed via a gem).
>
>On 11/9/06, J-Van <> wrote:
>>On Windows XP, Ruby 1.8.5:
>>
>># start notepad
>>irb(main):003:0> info = Process.create :app_name => "notepad"
>>=> #<struct Struct:rocessInfo process_handle=1916,
>>thread_handle=1912, process_id=3536, thread_id=3088>
>>
>># 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
>>

>

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'
=> #<struct Struct:rocessInfo process_handle=1916, thread_handle=1912,
process
_id=1748, thread_id=1108>
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 Heesob

__________________________________________________ _______________
Don't just search. Find. Check out the new MSN Search!
http://search.msn.click-url.com/go/o...ave/direct/01/


 
Reply With Quote
 
J-Van
Guest
Posts: n/a
 
      11-10-2006
On 11/10/06, Park Heesob <> wrote:
>
> Hi,
>
> >From: J-Van <>
> >Reply-To: ruby-
> >To: ruby- (ruby-talk ML)
> >Subject: Re: win32/process question
> >Date: Fri, 10 Nov 2006 15:23:58 +0900
> >
> >I guess I should note that this is after I require 'win32/process'
> >(which is installed via a gem).
> >
> >On 11/9/06, J-Van <> wrote:
> >>On Windows XP, Ruby 1.8.5:
> >>
> >># start notepad
> >>irb(main):003:0> info = Process.create :app_name => "notepad"
> >>=> #<struct Struct:rocessInfo process_handle=1916,
> >>thread_handle=1912, process_id=3536, thread_id=3088>
> >>
> >># 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
> >>

> >

> 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'
> => #<struct Struct:rocessInfo process_handle=1916, thread_handle=1912,
> process
> _id=1748, thread_id=1108>
> 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


Fantastic, thanks!

Joe

 
Reply With Quote
 
J-Van
Guest
Posts: n/a
 
      11-10-2006
On 11/10/06, Park Heesob <> wrote:
>
> Hi,
>
> >From: J-Van <>
> >Reply-To: ruby-
> >To: ruby- (ruby-talk ML)
> >Subject: Re: win32/process question
> >Date: Fri, 10 Nov 2006 15:23:58 +0900
> >
> >I guess I should note that this is after I require 'win32/process'
> >(which is installed via a gem).
> >
> >On 11/9/06, J-Van <> wrote:
> >>On Windows XP, Ruby 1.8.5:
> >>
> >># start notepad
> >>irb(main):003:0> info = Process.create :app_name => "notepad"
> >>=> #<struct Struct:rocessInfo process_handle=1916,
> >>thread_handle=1912, process_id=3536, thread_id=3088>
> >>
> >># 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
> >>

> >

> 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'
> => #<struct Struct:rocessInfo process_handle=1916, thread_handle=1912,
> process
> _id=1748, thread_id=1108>
> 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


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,
<pid>) would return an exception once the user closed the program?

Joe

 
Reply With Quote
 
Park Heesob
Guest
Posts: n/a
 
      11-11-2006

Hi,

>From: J-Van <>
>Reply-To: ruby-
>To: ruby- (ruby-talk ML)
>Subject: Re: win32/process question
>Date: Sat, 11 Nov 2006 03:24:34 +0900
>
>On 11/10/06, Park Heesob <> wrote:
>>
>>Hi,
>>

....
>> >

>>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'
>>=> #<struct Struct:rocessInfo process_handle=1916, thread_handle=1912,
>>process
>>_id=1748, thread_id=1108>
>>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

>
>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,
><pid>) 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 Heesob

__________________________________________________ _______________
Express yourself instantly with MSN Messenger! Download today it's FREE!
http://messenger.msn.click-url.com/g...ave/direct/01/


 
Reply With Quote
 
J-Van
Guest
Posts: n/a
 
      11-11-2006
On 11/10/06, Park Heesob <> wrote:
>
> Hi,
>
> >From: J-Van <>
> >Reply-To: ruby-
> >To: ruby- (ruby-talk ML)
> >Subject: Re: win32/process question
> >Date: Sat, 11 Nov 2006 03:24:34 +0900
> >
> >On 11/10/06, Park Heesob <> wrote:
> >>
> >>Hi,
> >>

> ....
> >> >
> >>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'
> >>=> #<struct Struct:rocessInfo process_handle=1916, thread_handle=1912,
> >>process
> >>_id=1748, thread_id=1108>
> >>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

> >
> >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,
> ><pid>) 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)



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

 
Reply With Quote
 
Park Heesob
Guest
Posts: n/a
 
      11-11-2006



>From: J-Van <>
>Reply-To: ruby-
>To: ruby- (ruby-talk ML)
>Subject: Re: win32/process question
>Date: Sat, 11 Nov 2006 09:29:10 +0900
>

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

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 Heesob

__________________________________________________ _______________
FREE pop-up blocking with the new MSN Toolbar - get it now!
http://toolbar.msn.click-url.com/go/...ave/direct/01/


 
Reply With Quote
 
J-Van
Guest
Posts: n/a
 
      11-11-2006
On 11/10/06, Park Heesob <> wrote:
> >From: J-Van <>
> >Reply-To: ruby-
> >To: ruby- (ruby-talk ML)
> >Subject: Re: win32/process question
> >Date: Sat, 11 Nov 2006 09:29:10 +0900
> >

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

> 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


Thanks -- I'll try that. I'm not exactly sure what those functions do
though.

Joe

 
Reply With Quote
 
Daniel Berger
Guest
Posts: n/a
 
      11-21-2006
Park Heesob wrote:

<snip>

> >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,
> ><pid>) 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)


Hm, maybe we should provide a block form for Process.create that does
this behind the scenes. What do you think?

Regards,

Dan

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
question row filter (more of sql query question) =?Utf-8?B?YW5kcmV3MDA3?= ASP .Net 2 10-06-2005 01:07 PM
Quick Question - Newby Question =?Utf-8?B?UnlhbiBTbWl0aA==?= ASP .Net 4 02-16-2005 11:59 AM
Question on Transcender Question :-) eddiec MCSE 6 05-20-2004 06:59 AM
Question re: features of the 831 router (also a 924 question) Wayne Cisco 0 03-02-2004 07:57 PM
Syntax Question - Novice Question sean ASP .Net 1 10-20-2003 12:18 PM



Advertisments
 



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57