# Testing whether a process has completed

**URL:** <https://www.ruby-forum.com/t/testing-whether-a-process-has-completed/76226>\
**Category:** Ruby\
**Created:** [November 16, 2006, 9:29pm UTC](https://www.ruby-forum.com/t/testing-whether-a-process-has-completed/76226 "2006-11-16T21:29:38Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [November 16, 2006, 9:29pm UTC](https://www.ruby-forum.com/t/testing-whether-a-process-has-completed/76226/1 "2006-11-16T21:29:38Z")

</div>

On Fri, 17 Nov 2006, Matthew W. wrote:

> So your saying that, when running a program from the command prompt, it  
> isn’t possible to find out if the program is waiting for input from the  
> user or is just executing part of the program?

yes. it’s impossible on every platform in every language to do in a  
reliable  
and generic way.

> So how would you advise i go about trying to determine whether or not the  
> program is waiting for input? Should i wait for a certain time and then try  
> and write to the program?

can you state **exactly** what you are trying to accomplish please: i  
think  
there is a fundemental problem with your design which you are not  
considering:

1. it might always be possible to send **all** input up front. in  
fact,  
this is the normal case, in general it’s not needed to know **when**  
a  
program is waiting for input, only that it will be at some point and  
you  
then simply send it all up from. eg

```
 IO.popen( cmd, 'r+' ) do |pipe|
   pipe.write the_precalculated_stdin
   pipe.close_write
   pipe.read
 end

```

this is, by far, the normal means of bi-directional communication  
with  
proccess.

1. the input you send depends on the output of the program, in that  
case you  
will have this sort of logic

```
 IO.popen( cmd, 'r+' ) do |pipe|
   pipe.each do |stdout|
     case stdout
       when /foo/
         pipe.write 'you need foo'
       when /bar
         pipe.write 'you need bar'
       else
         pipe.write 'you need foobar'
     end
   end
 end

```

it seems like this problems your are having result from not realizing  
that  
input into any program, in any platform, is buffered by the os and your  
program can merely send it when it finds it convenient - maybe i’m  
wrong, but  
it’s extrememly hard for me to imagine a scenario where one would  
**need** to  
know when a program required input - especially if one considers  
multi-threaded or forking programs which may require multiple inputs at  
once.

regards.

-a
