Click here to get back home

how to get the output from: Win32::Process::Create

 HomeNewsGroups | Search | About
 comp.lang.perl.misc    Post an article   get this group's latest topics as an RSS feed add this group's latest topics to your My MSN content add this group's latest topics to your My Yahoo content
Subject Author Date
how to get the output from: Win32::Process::Create joez3 08-31-2006
Get Chitika Premium
Posted by joez3 on August 31, 2006, 2:58 pm
Please log in for more thread options
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.
Then I tried:
open (FHCMD, Win32::Process::Create($processObj, $appName,
$commandLine, 1, DETACHED_PROCESS, ".")." |");

while (<FHCMD>) {
        print $_;
}

close (FHCMD);

This start the exe, but nothing is put in FHCMD.
Any ideas on how i get the output?
Thanks,
zim


Posted by Paul Lalli on August 31, 2006, 3:03 pm
Please log in for more thread options
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)

Paul Lalli


Posted by joez3 on August 31, 2006, 3:27 pm
Please log in for more thread options

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)
>
> Paul Lalli

Hi Paul,
I am not sure what the backticks buy me, 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`." | ");
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?
Thanks,
zim


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


Posted by Paul Lalli on August 31, 2006, 4:12 pm
Please log in for more thread options
Paul Lalli wrote:
> 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.

I guess the other possibility is to fork your program, and set up the
child to have a signal handler to be notified when the parent wants to
kill it....

[untested]

my $pid = fork();
if ($pid == 0) { #child

$SIG = sub { print "Parent told me to die!\n"; exit };

open my $pipe, "test.exe |" or die "Cannot open pipe: $!";
while (my $line = <$pipe>) {
process_line($line);
}
print "test.exe ended before parent told me to die!\n";
}
else { #parent
#do stuff
# la la la
if (want_to_kill()) {
kill ('INT', $pid);
}
#do more stuff, la la la
}

Paul Lalli


Similar ThreadsPosted
Re: how to get the output from: Win32::Process::Create August 31, 2006, 7:06 pm
Win32::Process->Create, can't get right syntax July 12, 2005, 6:49 pm
Using Win32::Process::Create with multiple child processes. August 30, 2005, 6:03 pm
win32::process capture the output June 5, 2006, 4:59 am
couldn't create child process: 720003 May 1, 2006, 9:08 am
DBD:Pg unable to connect as CGI process -- could not create socket July 28, 2005, 8:46 pm
Can perl create process or thread to do things concurrently? November 21, 2006, 10:36 pm
Question about Win32::Process March 7, 2006, 8:11 am
Keeping changes to %ENV in Win32 process September 12, 2006, 5:43 am
Re: Help: How to process output of a program October 15, 2008, 2:06 pm

Our other projects:

Art Dolls, Fairies and Mermaids - Sunnyfaces.net

Roy's Linux, Programming and Search Engines messages

1-Script XML SitemapXML Sitemap