Invoking External Program

B

brian.kejser

Hi

I've been able to launch an external program and read standard output
using the following code.

IO.popen("program.exe", 'r+') do |io|
io.puts "command line input"
io.close_write
puts io.read
end

1) How would I add a timeout to the command (e.g. 10 seconds)?
2) How would I check the error level (e.g. 0, 1, etc)?
3) How would I read standard error?

Thanks
 
J

Jan Svitok

Hi

I've been able to launch an external program and read standard output
using the following code.

IO.popen("program.exe", 'r+') do |io|
io.puts "command line input"
io.close_write
puts io.read
end

1) How would I add a timeout to the command (e.g. 10 seconds)?
2) How would I check the error level (e.g. 0, 1, etc)?
3) How would I read standard error?

Just quick, uncomplete answers (from .exe I guess you are on windows):

1. try using Timeout.timeout [1] but I'm not sure how successful
you'll be - when the program blocks then you probably won't be able to
do anything. When the timeout elapses, you'd need to kill the process.

2. use $? [2]

3. look for popen3 [3] or redirect stderr to stdout or a file. I'm not
sure whether popen3 works on windows.

[1] http://ruby-doc.org/core/classes/Timeout.html#M001924
[2] http://www.zenspider.com/Languages/Ruby/QuickRef.html#18
[3] http://ruby-doc.org/stdlib/libdoc/open3/rdoc/index.html
 
B

brian.kejser

Hi

Comments made inline ....

-----Original Message-----
From: "Jan Svitok" <[email protected]>
Sent: Sun, September 3, 2006 19:23
To: "ruby-talk ML" <[email protected]>
Subject: Re: Invoking External Program

Hi

I've been able to launch an external program and read standard output
using the following code.

IO.popen("program.exe", 'r+') do |io|
io.puts "command line input"
io.close_write
puts io.read
end

1) How would I add a timeout to the command (e.g. 10 seconds)?
2) How would I check the error level (e.g. 0, 1, etc)?
3) How would I read standard error?


Just quick, uncomplete answers (from .exe I guess you are on windows):
1. try using Timeout.timeout [1] but I'm not sure how successful
you'll be - when the program blocks then you probably won't be able to
do anything. When the timeout elapses, you'd need to kill the process.

Thanks. It worked.
2. use $? [2]

It didn't work, however, the following code did.

exitstatus = Process.waitpid2(io.pid)[1].exitstatus

Are there any problems with getting the exit status by this means?
3. look for popen3 [3] or redirect stderr to stdout or a file. I'm not
sure whether popen3 works on windows.

Yeah. It doesn't look like popen3 is supported on windows.

Thanks
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,777
Messages
2,569,604
Members
45,214
Latest member
JFrancisDavis

Latest Threads

Top