win32-process 0.6.3 → 0.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES +9 -0
- data/MANIFEST +11 -11
- data/Rakefile +22 -0
- data/examples/{test_create.rb → example_create.rb} +35 -39
- data/examples/{test_fork_wait.rb → example_fork_wait.rb} +29 -33
- data/examples/{test_fork_waitpid.rb → example_fork_waitpid.rb} +46 -50
- data/examples/example_kill.rb +34 -0
- data/lib/win32/process.rb +29 -6
- data/test/test_win32_process.rb +1 -1
- data/win32-process.gemspec +1 -1
- metadata +8 -8
- data/examples/test_kill.rb +0 -35
data/CHANGES
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
= 0.6.4 - 13-Nov-2010
|
2
|
+
* Altered the wait, wait2, waitpid and waitpid2 methods to match the current
|
3
|
+
MRI interface, i.e. they accept and optional pid and flags, though the
|
4
|
+
latter is ignored. Thanks go to Robert Wahler for the spot.
|
5
|
+
* Renamed the example scripts to avoid any potential confusion with actual
|
6
|
+
test scripts and cleaned them up a bit.
|
7
|
+
* Added Rake tasks to run the example programs.
|
8
|
+
* Updated the MANIFEST.
|
9
|
+
|
1
10
|
= 0.6.3 - 9-Nov-2010
|
2
11
|
* Fixed a bug in the Process.kill method where the remote thread created
|
3
12
|
was not being properly closed. Thanks go to Ben Nagy for the spot.
|
data/MANIFEST
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
* CHANGES
|
2
|
-
* README
|
3
|
-
* MANIFEST
|
4
|
-
* Rakefile
|
5
|
-
* win32-process.gemspec
|
6
|
-
* examples/
|
7
|
-
* examples/
|
8
|
-
* examples/
|
9
|
-
* examples/
|
10
|
-
* lib/win32/process.rb
|
11
|
-
* test/
|
1
|
+
* CHANGES
|
2
|
+
* README
|
3
|
+
* MANIFEST
|
4
|
+
* Rakefile
|
5
|
+
* win32-process.gemspec
|
6
|
+
* examples/example_create.rb
|
7
|
+
* examples/example_fork_wait.rb
|
8
|
+
* examples/example_fork_waitpid.rb
|
9
|
+
* examples/example_kill.rb
|
10
|
+
* lib/win32/process.rb
|
11
|
+
* test/test_process.rb
|
data/Rakefile
CHANGED
@@ -20,6 +20,28 @@ namespace :gem do
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
+
namespace :example do
|
24
|
+
desc 'Run the fork + wait example'
|
25
|
+
task :fork_wait do
|
26
|
+
sh "ruby -Ilib examples/example_fork_wait.rb"
|
27
|
+
end
|
28
|
+
|
29
|
+
desc 'Run the fork + waitpid example'
|
30
|
+
task :fork_waitpid do
|
31
|
+
sh "ruby -Ilib examples/example_fork_waitpid.rb"
|
32
|
+
end
|
33
|
+
|
34
|
+
desc 'Run the kill example'
|
35
|
+
task :kill do
|
36
|
+
sh "ruby -Ilib examples/example_kill.rb"
|
37
|
+
end
|
38
|
+
|
39
|
+
desc 'Run the create example'
|
40
|
+
task :create do
|
41
|
+
sh "ruby -Ilib examples/example_create.rb"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
23
45
|
Rake::TestTask.new do |t|
|
24
46
|
t.verbose = true
|
25
47
|
t.warning = true
|
@@ -1,39 +1,35 @@
|
|
1
|
-
##########################################################################
|
2
|
-
#
|
3
|
-
#
|
4
|
-
# Simple test program for the Process.create() method.
|
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
|
-
puts "Pid of new process: #{pid}"
|
39
|
-
=end
|
1
|
+
##########################################################################
|
2
|
+
# example_create.rb
|
3
|
+
#
|
4
|
+
# Simple test program for the Process.create() method. You can run this
|
5
|
+
# code via the 'example:create' task.
|
6
|
+
##########################################################################
|
7
|
+
require "win32/process"
|
8
|
+
|
9
|
+
p Process::WIN32_PROCESS_VERSION
|
10
|
+
|
11
|
+
struct = Process.create(
|
12
|
+
:app_name => "notepad.exe",
|
13
|
+
:creation_flags => Process::DETACHED_PROCESS,
|
14
|
+
:process_inherit => false,
|
15
|
+
:thread_inherit => true,
|
16
|
+
:cwd => "C:\\",
|
17
|
+
:inherit => true,
|
18
|
+
:environment => "SYSTEMROOT=#{ENV['SYSTEMROOT']};PATH=C:\\"
|
19
|
+
)
|
20
|
+
|
21
|
+
p struct
|
22
|
+
|
23
|
+
=begin
|
24
|
+
# Don't run this from an existing terminal
|
25
|
+
pid = Process.create(
|
26
|
+
:app_name => "cmd.exe",
|
27
|
+
:creation_flags => Process::DETACHED_PROCESS,
|
28
|
+
:startf_flags => Process::USEPOSITION,
|
29
|
+
:x => 0,
|
30
|
+
:y => 0,
|
31
|
+
:title => "Hi Dan"
|
32
|
+
)
|
33
|
+
|
34
|
+
puts "Pid of new process: #{pid}"
|
35
|
+
=end
|
@@ -1,33 +1,29 @@
|
|
1
|
-
##########################################################################
|
2
|
-
#
|
3
|
-
#
|
4
|
-
# Generic test script for futzing around with the block form of
|
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
|
-
Process.wait
|
31
|
-
|
32
|
-
# Children should be done here before continuing on
|
33
|
-
puts "Continuing on..."
|
1
|
+
##########################################################################
|
2
|
+
# example_fork_wait.rb
|
3
|
+
#
|
4
|
+
# Generic test script for futzing around with the block form of
|
5
|
+
# fork/wait. You can run this example via the 'example:fork_wait' task.
|
6
|
+
##########################################################################
|
7
|
+
require 'win32/process'
|
8
|
+
|
9
|
+
puts "VERSION: " + Process::WIN32_PROCESS_VERSION
|
10
|
+
|
11
|
+
# In the child, using block form
|
12
|
+
fork{
|
13
|
+
7.times { |i|
|
14
|
+
puts "Child: #{i}"
|
15
|
+
sleep 1
|
16
|
+
}
|
17
|
+
}
|
18
|
+
|
19
|
+
# Back in the parent
|
20
|
+
4.times{ |i|
|
21
|
+
puts "Parent: #{i}"
|
22
|
+
sleep 1
|
23
|
+
}
|
24
|
+
|
25
|
+
# Wait for the children
|
26
|
+
Process.wait
|
27
|
+
|
28
|
+
# Children should be done here before continuing on
|
29
|
+
puts "Continuing on..."
|
@@ -1,50 +1,46 @@
|
|
1
|
-
##########################################################################
|
2
|
-
#
|
3
|
-
#
|
4
|
-
# Generic test script for futzing around with the traditional form of
|
5
|
-
# fork/wait, plus waitpid and waitpid2.
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
puts "
|
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
|
-
p Process.waitpid2(pid2)
|
48
|
-
|
49
|
-
puts "Continuing on..."
|
50
|
-
|
1
|
+
##########################################################################
|
2
|
+
# example_fork_waitpid.rb
|
3
|
+
#
|
4
|
+
# Generic test script for futzing around with the traditional form of
|
5
|
+
# fork/wait, plus waitpid and waitpid2.
|
6
|
+
#
|
7
|
+
# You can run this code via the 'example:fork_waitpid' task.
|
8
|
+
##########################################################################
|
9
|
+
require 'win32/process'
|
10
|
+
|
11
|
+
puts "VERSION: " + Process::WIN32_PROCESS_VERSION
|
12
|
+
|
13
|
+
pid = Process.fork
|
14
|
+
puts "PID1: #{pid}"
|
15
|
+
|
16
|
+
#child
|
17
|
+
if pid.nil?
|
18
|
+
7.times{ |i|
|
19
|
+
puts "Child: #{i}"
|
20
|
+
sleep 1
|
21
|
+
}
|
22
|
+
exit(-1)
|
23
|
+
end
|
24
|
+
|
25
|
+
pid2 = Process.fork
|
26
|
+
puts "PID2: #{pid2}"
|
27
|
+
|
28
|
+
#child2
|
29
|
+
if pid2.nil?
|
30
|
+
7.times{ |i|
|
31
|
+
puts "Child2: #{i}"
|
32
|
+
sleep 1
|
33
|
+
}
|
34
|
+
exit(1)
|
35
|
+
end
|
36
|
+
|
37
|
+
#parent
|
38
|
+
2.times { |i|
|
39
|
+
puts "Parent: #{i}"
|
40
|
+
sleep 1
|
41
|
+
}
|
42
|
+
|
43
|
+
p Process.waitpid2(pid)
|
44
|
+
p Process.waitpid2(pid2)
|
45
|
+
|
46
|
+
puts "Continuing on..."
|
@@ -0,0 +1,34 @@
|
|
1
|
+
##########################################################################
|
2
|
+
# example_kill.rb
|
3
|
+
#
|
4
|
+
# Generic test script for futzing around Process.kill. This script
|
5
|
+
# requires the sys-proctable library.
|
6
|
+
#
|
7
|
+
# You can run this example via the 'example:kill' task.
|
8
|
+
##########################################################################
|
9
|
+
require "win32/process"
|
10
|
+
|
11
|
+
begin
|
12
|
+
require "sys/proctable"
|
13
|
+
rescue LoadError
|
14
|
+
STDERR.puts "Whoa there!"
|
15
|
+
STDERR.puts "This script requires the sys-proctable package to work."
|
16
|
+
STDERR.puts "You can find it at http://ruby-sysutils.sf.net"
|
17
|
+
STDERR.puts "Exiting..."
|
18
|
+
exit
|
19
|
+
end
|
20
|
+
|
21
|
+
include Sys
|
22
|
+
|
23
|
+
puts "VERSION: " + Process::WIN32_PROCESS_VERSION
|
24
|
+
|
25
|
+
IO.popen("notepad")
|
26
|
+
sleep 1 # Give it a chance to start before checking for its pid
|
27
|
+
|
28
|
+
pids = []
|
29
|
+
|
30
|
+
ProcTable.ps{ |s|
|
31
|
+
pids.push(s.pid) if s.cmdline =~ /notepad/i
|
32
|
+
}
|
33
|
+
|
34
|
+
p Process.kill(9,pids.last)
|
data/lib/win32/process.rb
CHANGED
@@ -21,7 +21,7 @@ module Process
|
|
21
21
|
undef_method :setpriority, :wait, :wait2, :waitpid, :waitpid2, :uid
|
22
22
|
|
23
23
|
# The version of the win32-process library
|
24
|
-
WIN32_PROCESS_VERSION = '0.6.
|
24
|
+
WIN32_PROCESS_VERSION = '0.6.4'
|
25
25
|
|
26
26
|
include Windows::Process
|
27
27
|
include Windows::Thread
|
@@ -424,10 +424,13 @@ module Process
|
|
424
424
|
|
425
425
|
# Waits for the given child process to exit and returns that pid.
|
426
426
|
#
|
427
|
+
# The +flags+ argument is ignored at the moment. It is provided strictly
|
428
|
+
# for interface compatibility.
|
429
|
+
#
|
427
430
|
# Note that the $? (Process::Status) global variable is NOT set. This
|
428
431
|
# may be addressed in a future release.
|
429
432
|
#
|
430
|
-
def waitpid(pid)
|
433
|
+
def waitpid(pid, flags = nil)
|
431
434
|
exit_code = [0].pack('L')
|
432
435
|
handle = OpenProcess(PROCESS_ALL_ACCESS, 0, pid)
|
433
436
|
|
@@ -456,6 +459,9 @@ module Process
|
|
456
459
|
|
457
460
|
# Waits for the given child process to exit and returns an array containing
|
458
461
|
# the process id and the exit status.
|
462
|
+
#
|
463
|
+
# The +flags+ argument is ignored at the moment. It is provided strictly
|
464
|
+
# for interface compatibility.
|
459
465
|
#
|
460
466
|
# Note that the $? (Process::Status) global variable is NOT set. This
|
461
467
|
# may be addressed in a future release if/when possible.
|
@@ -463,7 +469,7 @@ module Process
|
|
463
469
|
# Ruby does not provide a way to hook into $? so there's no way for us
|
464
470
|
# to set it.
|
465
471
|
#
|
466
|
-
def waitpid2(pid)
|
472
|
+
def waitpid2(pid, flags = nil)
|
467
473
|
exit_code = [0].pack('L')
|
468
474
|
handle = OpenProcess(PROCESS_ALL_ACCESS, 0, pid)
|
469
475
|
|
@@ -877,7 +883,11 @@ module Process
|
|
877
883
|
end
|
878
884
|
|
879
885
|
# Waits for any child process to exit and returns the process id of that
|
880
|
-
# child.
|
886
|
+
# child. If a pid is provided that is greater than or equal to 0, then
|
887
|
+
# it is the equivalent of calling Process.waitpid.
|
888
|
+
#
|
889
|
+
# The +flags+ argument is ignored at the moment. It is provided strictly
|
890
|
+
# for interface compatibility.
|
881
891
|
#
|
882
892
|
# Note that the $? (Process::Status) global variable is NOT set. This
|
883
893
|
# may be addressed in a future release.
|
@@ -885,7 +895,12 @@ module Process
|
|
885
895
|
# The GetProcessId() function is not defined in Windows 2000 or earlier
|
886
896
|
# so we have to do some extra work for those platforms.
|
887
897
|
#
|
888
|
-
def wait
|
898
|
+
def wait(pid = -1, flags = nil)
|
899
|
+
if pid && pid >= 0
|
900
|
+
pid, status = waitpid(pid, flags)
|
901
|
+
return pid
|
902
|
+
end
|
903
|
+
|
889
904
|
handles = []
|
890
905
|
|
891
906
|
# Windows 2000 or earlier
|
@@ -933,6 +948,9 @@ module Process
|
|
933
948
|
|
934
949
|
# Waits for any child process to exit and returns an array containing the
|
935
950
|
# process id and the exit status of that child.
|
951
|
+
#
|
952
|
+
# The +flags+ argument is ignored at the moment. It is provided strictly
|
953
|
+
# for interface compatibility.
|
936
954
|
#
|
937
955
|
# Note that the $? (Process::Status) global variable is NOT set. This
|
938
956
|
# may be addressed in a future release.
|
@@ -940,7 +958,12 @@ module Process
|
|
940
958
|
# The GetProcessId() function is not defined in Windows 2000 or earlier
|
941
959
|
# so we have to do some extra work for those platforms.
|
942
960
|
#
|
943
|
-
def wait2
|
961
|
+
def wait2(pid = -1, flags = nil)
|
962
|
+
if pid && pid >= 0
|
963
|
+
pid, status = waitpid2(pid, flags)
|
964
|
+
return pid
|
965
|
+
end
|
966
|
+
|
944
967
|
handles = []
|
945
968
|
|
946
969
|
# Windows 2000 or earlier
|
data/test/test_win32_process.rb
CHANGED
data/win32-process.gemspec
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: win32-process
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 6
|
9
|
-
-
|
10
|
-
version: 0.6.
|
9
|
+
- 4
|
10
|
+
version: 0.6.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Daniel Berger
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2010-11-
|
19
|
+
date: 2010-11-13 00:00:00 -07:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
@@ -77,10 +77,10 @@ extra_rdoc_files:
|
|
77
77
|
- MANIFEST
|
78
78
|
files:
|
79
79
|
- CHANGES
|
80
|
-
- examples/
|
81
|
-
- examples/
|
82
|
-
- examples/
|
83
|
-
- examples/
|
80
|
+
- examples/example_create.rb
|
81
|
+
- examples/example_fork_wait.rb
|
82
|
+
- examples/example_fork_waitpid.rb
|
83
|
+
- examples/example_kill.rb
|
84
84
|
- lib/win32/process.rb
|
85
85
|
- MANIFEST
|
86
86
|
- Rakefile
|
data/examples/test_kill.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
##########################################################################
|
2
|
-
# test_kill.rb
|
3
|
-
#
|
4
|
-
# Generic test script for futzing around Process.kill. This script
|
5
|
-
# requires the sys-proctable package (available on the RAA).
|
6
|
-
##########################################################################
|
7
|
-
Dir.chdir('..') if File.basename(Dir.pwd) == 'examples'
|
8
|
-
$LOAD_PATH.unshift Dir.pwd
|
9
|
-
$LOAD_PATH.unshift Dir.pwd + '/lib'
|
10
|
-
Dir.chdir('examples') rescue nil
|
11
|
-
|
12
|
-
require "win32/process"
|
13
|
-
|
14
|
-
begin
|
15
|
-
require "sys/proctable"
|
16
|
-
rescue LoadError
|
17
|
-
STDERR.puts "Whoa there!"
|
18
|
-
STDERR.puts "This script requires the sys-proctable package to work."
|
19
|
-
STDERR.puts "You can find it at http://ruby-sysutils.sf.net"
|
20
|
-
STDERR.puts "Exiting..."
|
21
|
-
exit
|
22
|
-
end
|
23
|
-
include Sys
|
24
|
-
|
25
|
-
puts "VERSION: " + Process::WIN32_PROCESS_VERSION
|
26
|
-
|
27
|
-
IO.popen("notepad")
|
28
|
-
sleep 1 # Give it a chance to start before checking for its pid
|
29
|
-
|
30
|
-
pids = []
|
31
|
-
ProcTable.ps{ |s|
|
32
|
-
pids.push(s.pid) if s.cmdline =~ /notepad/i
|
33
|
-
}
|
34
|
-
|
35
|
-
p Process.kill(9,pids.last)
|