|
Posted by Paul Lalli on August 31, 2006, 4:05 pm
Please log in for more thread options joez3@yahoo.com wrote:
> Paul Lalli wrote:
> > joez3@yahoo.com wrote:
> > > Hi all,
> > > This might be more a windows question then perl, but lets see if
> > > someone can help me out. I am using Win32::Process::Create to start up
> > > an exe. I can get exe to start, but I need to get what is put out on
> > > the command prompt.
> > > If i try text.exe > temp.txt I can start the exe and the temp.txt file
> > > gets created, but nothing is in it. The text is put in another command
> > > prompt window. So this rules out using system () to start the exe.
> >
> > Is there any particular reason you're not just using backticks?
> >
> > perldoc perlop
> > (search for qx)
> I am not sure what the backticks buy me,
They buy you the ability to get the output of your program, which is
what you said you wanted.
> i can start up the exe with
> the Process::Create. Maybe i should have said more about the exe under
> test, its a program that will stay up untill I kill it. By using the
> Process::Create I can get the pid and use that to kill it. With the
> backticks I tried the following:
> open (FHCMD, `start test.exe`." | ");
This makes just as little sense as your original.
Win32::Process::Create returns either 0 or non-zero depending on
whether or not the program was successfully started. Backticks return
the output of the command. You're trying to open a pipe to these
return values, instead of opening a pipe to the actual command.
> while (<FHCMD>) {
> print $_;
> }
> This starts the test.exe, but it ends up hanging the perl script and I
> can't get the contents of FHCMD.
> What should I try next?
You should take a step back and think about what it is you're actually
trying to do, and how to go about doing it. Your last two attempts
have been nonsensical, which is a sure sign that you've reached the
point of frustration and are now throwing things at the wall to see
what sticks.
You apparently have two requirements. One is that you need to capture
the output of the program. The other is that you need to get the pid
of the program so you can later kill it. These two requirements seem,
to me, to be contraditory. The only way it makes sense is if you don't
want your Perl script to do anything else while this program is
running. Is that correct? If so: open a pipe to the process. Start
reading its output. Whenever you've decided you want to kill it, exit
the loop and close the handle. IIRC, that will send a SIGPIPE to the
program, effectively terminating it.
open my $pipe, "test.exe |" or die "Cannot start program: $!";
while (my $line = <$pipe>) {
#do something with $line
if (want_to_kill()) {
last;
}
}
close $pipe;
Paul Lalli
|