Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Perl > Win32 - forked process doesn't create a Window

Reply
Thread Tools

Win32 - forked process doesn't create a Window

 
 
RL
Guest
Posts: n/a
 
      02-02-2004
Hello Perl gurus,

1. I have a web page where I can push a button (dospawn.html).
2. This button calls a CGI script (spawnboss.cgi)
3. spawnboss.cgi calls a forking perl script (forkme.pl)
4. forkme.pl calls the process creation script (createme.pl)
5. createme.pl creates my notepad.exe process, but no window shows up on my
PC.

The result on my web browser is:
SPAWNBOSS: Running perl forkme.pl C:\Windows\system32 notepad.exe
FORKME: Forking perl createme.pl C:\Windows\system32 notepad.exe
CREATEME: Starting C:\Windows\system32\notepad.exe
CREATEME: process notepad.exe is running

When I kill the notepad.exe from my Task Manager,
I then get on my web browser the final output:
CREATEME: process notepad.exe was ended

The only thing missing is the graphical window for NOTEPAD so I can type
into it.

Thanks for your assistance
Rob

Details following...

Have the latest installed version of ActivePerl 5.8.2.
The web page is on my personal Apache web server 2.0.47.
http://localhost/~test/dospawn.html
Configured for CGI with:
=====================================
LoadModule cgi_module modules/mod_cgi.so
ScriptAlias /cgi-bin/ "D:/Apps/Apache2/cgi-bin/"
UserDir "D:\Web\USERS"
<Directory "D:/Web/USERS/test/cgi-bin/">
AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
</Directory>
AddHandler cgi-script .cgi .pl
=====================================

The files are as follows:
=====================================
DOSPAWN.HTML
<html><body>
<form action="cgi-bin/spawnboss.cgi?action=spawn" method="post"
enctype="multipart/form-data">
<input type=hidden name="action" value="spawn">
<input type="submit" value="Spawn NOTEPAD">
</form>
</body></html>
=====================================
SPAWNBOSS.CGI
#!d:/apps/perl/bin/perl.exe
use CGI qw/:standard :html3/;
&spawn if (param('action') eq 'spawn'); # Spawn a process
exit;
sub spawn {
print "Content-type: text/html\n\n";
print "<HTML><BODY>\n";
$command = "perl forkme.pl C:\\Windows\\system32 notepad.exe";
print "SPAWNBOSS: Running $command<br>\n";
system("$command");
print "</BODY></HTML>\n";
return;
}
=====================================
FORKME.PL
#!d:/apps/perl/bin/perl.exe
$command = "perl createme.pl $ARGV[0] $ARGV[1]";
if ($pid = fork) {
print "FORKME: Forking $command<br>\n";
exec "$command";
die "couldn't exec $command : $!";
}
else {
die "DO_RUNME: fork failed: $!";
}
exit;
=====================================
CREATEME.PL
#!d:/apps/perl/bin/perl.exe
use Win32:rocess;
use IO::Handle;
STDOUT->autoflush(1);
STDERR->autoflush(1);
sub ErrorReport{
print Win32::FormatMessage( Win32::GetLastError() );
}
print("CREATEME: Starting $ARGV[0]\\$ARGV[1]<br>\n");
Win32:rocess::Create($ProcessObj,
"$ARGV[0]\\$ARGV[1]",
"$ARGV[1]",
1,
NORMAL_PRIORITY_CLASS,
"$ARGV[0]\\")|| die ErrorReport();
print("CREATEME: process $ARGV[1] is running<br>\n");
$ProcessObj->Wait(INFINITE);
print("CREATEME: process $ARGV[1] was ended<br>\n");
exit;
=====================================
The END



 
Reply With Quote
 
 
 
 
Jim Gibson
Guest
Posts: n/a
 
      02-06-2004
In article <rPhTb.2043$(E-Mail Removed)>, RL
<(E-Mail Removed)> wrote:

> Hello Perl gurus,
>
> 1. I have a web page where I can push a button (dospawn.html).
> 2. This button calls a CGI script (spawnboss.cgi)
> 3. spawnboss.cgi calls a forking perl script (forkme.pl)
> 4. forkme.pl calls the process creation script (createme.pl)
> 5. createme.pl creates my notepad.exe process, but no window shows up on my
> PC.
>
> The result on my web browser is:
> SPAWNBOSS: Running perl forkme.pl C:\Windows\system32 notepad.exe
> FORKME: Forking perl createme.pl C:\Windows\system32 notepad.exe
> CREATEME: Starting C:\Windows\system32\notepad.exe
> CREATEME: process notepad.exe is running
>
> When I kill the notepad.exe from my Task Manager,
> I then get on my web browser the final output:
> CREATEME: process notepad.exe was ended
>
> The only thing missing is the graphical window for NOTEPAD so I can type
> into it.
>
> Thanks for your assistance
> Rob


Since I don't work on Windows, I am afraid I can't help you too much. I
can, however, point out some oddities in your program.

>
> Details following...
>
> Have the latest installed version of ActivePerl 5.8.2.
> The web page is on my personal Apache web server 2.0.47.
> http://localhost/~test/dospawn.html
> Configured for CGI with:
> =====================================
> LoadModule cgi_module modules/mod_cgi.so
> ScriptAlias /cgi-bin/ "D:/Apps/Apache2/cgi-bin/"
> UserDir "D:\Web\USERS"
> <Directory "D:/Web/USERS/test/cgi-bin/">
> AllowOverride None
> Options ExecCGI
> Order allow,deny
> Allow from all
> </Directory>
> AddHandler cgi-script .cgi .pl
> =====================================
>
> The files are as follows:
> =====================================
> DOSPAWN.HTML
> <html><body>
> <form action="cgi-bin/spawnboss.cgi?action=spawn" method="post"
> enctype="multipart/form-data">
> <input type=hidden name="action" value="spawn">
> <input type="submit" value="Spawn NOTEPAD">
> </form>
> </body></html>
> =====================================
> SPAWNBOSS.CGI
> #!d:/apps/perl/bin/perl.exe
> use CGI qw/:standard :html3/;
> &spawn if (param('action') eq 'spawn'); # Spawn a process
> exit;
> sub spawn {
> print "Content-type: text/html\n\n";
> print "<HTML><BODY>\n";
> $command = "perl forkme.pl C:\\Windows\\system32 notepad.exe";
> print "SPAWNBOSS: Running $command<br>\n";
> system("$command");
> print "</BODY></HTML>\n";
> return;
> }
> =====================================
> FORKME.PL
> #!d:/apps/perl/bin/perl.exe
> $command = "perl createme.pl $ARGV[0] $ARGV[1]";
> if ($pid = fork) {
> print "FORKME: Forking $command<br>\n";
> exec "$command";
> die "couldn't exec $command : $!";
> }
> else {
> die "DO_RUNME: fork failed: $!";
> }
> exit;


fork() returns a non-zero pid (that of the child) to the parent and
returns zero to the child. Thus, you are exec'ing from the parent
process and the child just dies with an error message. You can probably
eliminate the fork and this entire script, since you are not using the
child process. Do you want the parent process to return the completed
web page to the browser while notepad.exe runs? Then you should run
notepad.exe from the child.


> =====================================
> CREATEME.PL
> #!d:/apps/perl/bin/perl.exe
> use Win32:rocess;
> use IO::Handle;
> STDOUT->autoflush(1);
> STDERR->autoflush(1);
> sub ErrorReport{
> print Win32::FormatMessage( Win32::GetLastError() );
> }
> print("CREATEME: Starting $ARGV[0]\\$ARGV[1]<br>\n");
> Win32:rocess::Create($ProcessObj,
> "$ARGV[0]\\$ARGV[1]",
> "$ARGV[1]",
> 1,
> NORMAL_PRIORITY_CLASS,
> "$ARGV[0]\\")|| die ErrorReport();
> print("CREATEME: process $ARGV[1] is running<br>\n");
> $ProcessObj->Wait(INFINITE);
> print("CREATEME: process $ARGV[1] was ended<br>\n");
> exit;
> =====================================
> The END
>


Another tip: make sure you can run your CGI script from the command
line before you try to execute it from the web server, if you have
command line access to the server.

FYI: this newsgroup is defunct. Try comp.lang.perl.misc in the future
for better response.
 
Reply With Quote
 
 
 
 
RL
Guest
Posts: n/a
 
      02-06-2004
Hi Jim,

You are correct, I don't need the fork.

Also, just realized I forgot to add the createme.pl program
=====================================
CREATEME.PL
#!d:/apps/perl/bin/perl.exe
use Win32:rocess;
use IO::Handle;
STDOUT->autoflush(1);
STDERR->autoflush(1);
sub ErrorReport{
print Win32::FormatMessage( Win32::GetLastError() );
}
print("CREATEME: Starting $ARGV[0]\\$ARGV[1]<br>\n");
Win32:rocess::Create($ProcessObj,
"$ARGV[0]\\$ARGV[1]",
"$ARGV[1]",
1,
NORMAL_PRIORITY_CLASS,
"$ARGV[0]\\")|| die ErrorReport();
print("CREATEME: process $ARGV[1] is running<br>\n");
$ProcessObj->Wait(INFINITE);
print("CREATEME: process $ARGV[1] was ended<br>\n");
exit;
=====================================

"Jim Gibson" <(E-Mail Removed)> wrote in message
news:050220041717002619%(E-Mail Removed). ..
> In article <rPhTb.2043$(E-Mail Removed)>, RL
> <(E-Mail Removed)> wrote:
>
> > Hello Perl gurus,
> >
> > 1. I have a web page where I can push a button (dospawn.html).
> > 2. This button calls a CGI script (spawnboss.cgi)
> > 3. spawnboss.cgi calls a forking perl script (forkme.pl)
> > 4. forkme.pl calls the process creation script (createme.pl)
> > 5. createme.pl creates my notepad.exe process, but no window shows up on

my
> > PC.
> >
> > The result on my web browser is:
> > SPAWNBOSS: Running perl forkme.pl C:\Windows\system32 notepad.exe
> > FORKME: Forking perl createme.pl C:\Windows\system32 notepad.exe
> > CREATEME: Starting C:\Windows\system32\notepad.exe
> > CREATEME: process notepad.exe is running
> >
> > When I kill the notepad.exe from my Task Manager,
> > I then get on my web browser the final output:
> > CREATEME: process notepad.exe was ended
> >
> > The only thing missing is the graphical window for NOTEPAD so I can type
> > into it.
> >
> > Thanks for your assistance
> > Rob

>
> Since I don't work on Windows, I am afraid I can't help you too much. I
> can, however, point out some oddities in your program.
>
> >
> > Details following...
> >
> > Have the latest installed version of ActivePerl 5.8.2.
> > The web page is on my personal Apache web server 2.0.47.
> > http://localhost/~test/dospawn.html
> > Configured for CGI with:
> > =====================================
> > LoadModule cgi_module modules/mod_cgi.so
> > ScriptAlias /cgi-bin/ "D:/Apps/Apache2/cgi-bin/"
> > UserDir "D:\Web\USERS"
> > <Directory "D:/Web/USERS/test/cgi-bin/">
> > AllowOverride None
> > Options ExecCGI
> > Order allow,deny
> > Allow from all
> > </Directory>
> > AddHandler cgi-script .cgi .pl
> > =====================================
> >
> > The files are as follows:
> > =====================================
> > DOSPAWN.HTML
> > <html><body>
> > <form action="cgi-bin/spawnboss.cgi?action=spawn" method="post"
> > enctype="multipart/form-data">
> > <input type=hidden name="action" value="spawn">
> > <input type="submit" value="Spawn NOTEPAD">
> > </form>
> > </body></html>
> > =====================================
> > SPAWNBOSS.CGI
> > #!d:/apps/perl/bin/perl.exe
> > use CGI qw/:standard :html3/;
> > &spawn if (param('action') eq 'spawn'); # Spawn a process
> > exit;
> > sub spawn {
> > print "Content-type: text/html\n\n";
> > print "<HTML><BODY>\n";
> > $command = "perl forkme.pl C:\\Windows\\system32 notepad.exe";
> > print "SPAWNBOSS: Running $command<br>\n";
> > system("$command");
> > print "</BODY></HTML>\n";
> > return;
> > }
> > =====================================
> > FORKME.PL
> > #!d:/apps/perl/bin/perl.exe
> > $command = "perl createme.pl $ARGV[0] $ARGV[1]";
> > if ($pid = fork) {
> > print "FORKME: Forking $command<br>\n";
> > exec "$command";
> > die "couldn't exec $command : $!";
> > }
> > else {
> > die "DO_RUNME: fork failed: $!";
> > }
> > exit;

>
> fork() returns a non-zero pid (that of the child) to the parent and
> returns zero to the child. Thus, you are exec'ing from the parent
> process and the child just dies with an error message. You can probably
> eliminate the fork and this entire script, since you are not using the
> child process. Do you want the parent process to return the completed
> web page to the browser while notepad.exe runs? Then you should run
> notepad.exe from the child.
>
>
> > =====================================
> > CREATEME.PL
> > #!d:/apps/perl/bin/perl.exe
> > use Win32:rocess;
> > use IO::Handle;
> > STDOUT->autoflush(1);
> > STDERR->autoflush(1);
> > sub ErrorReport{
> > print Win32::FormatMessage( Win32::GetLastError() );
> > }
> > print("CREATEME: Starting $ARGV[0]\\$ARGV[1]<br>\n");
> > Win32:rocess::Create($ProcessObj,
> > "$ARGV[0]\\$ARGV[1]",
> > "$ARGV[1]",
> > 1,
> > NORMAL_PRIORITY_CLASS,
> > "$ARGV[0]\\")|| die ErrorReport();
> > print("CREATEME: process $ARGV[1] is running<br>\n");
> > $ProcessObj->Wait(INFINITE);
> > print("CREATEME: process $ARGV[1] was ended<br>\n");
> > exit;
> > =====================================
> > The END
> >

>
> Another tip: make sure you can run your CGI script from the command
> line before you try to execute it from the web server, if you have
> command line access to the server.
>
> FYI: this newsgroup is defunct. Try comp.lang.perl.misc in the future
> for better response.



 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
win32/process Process.create failure Mike Stead Ruby 3 03-25-2010 01:15 AM
Win32/Process when create a process, how to pass data Qi Lu Ruby 0 07-14-2008 07:38 PM
Detecting problems in a forked process James Colannino Python 2 12-30-2005 06:24 AM
dbx/gdb Choosing Which Forked Process To Follow clusardi2k@aol.com C++ 2 04-13-2005 02:19 PM
How to tell if a forked process is done? John Lin Python 19 09-25-2003 04:22 PM



Advertisments