473,379 Members | 1,320 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,379 software developers and data experts.

Win32 - forked process doesn't create a Window

RL
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::Process;
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::Process::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

Jul 19 '05 #1
2 4960
In article <rP******************@news20.bellglobal.com>, RL
<lr*******@hotmail.com> 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::Process;
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::Process::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.
Jul 19 '05 #2
RL
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::Process;
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::Process::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" <jg*****@mail.arc.nasa.gov> wrote in message
news:050220041717002619%jg*****@mail.arc.nasa.gov. ..
In article <rP******************@news20.bellglobal.com>, RL
<lr*******@hotmail.com> 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::Process;
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::Process::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.

Jul 19 '05 #3

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

21
by: John Lin | last post by:
Howdy, I want to know how to tell if a forked process is done. Actually, my real question is that I want to run a shell script inside of a python script, and after the shell script has...
2
by: Paolo | last post by:
There is something I can't understand which is the following. I have a system command which runs a commandline to unzip a file: my $Out = system ( $rootPath."bin/bin/gunzip -dfc "....
1
by: Alexander N. Spitzer | last post by:
I am trying to write a program that will fork a process, and execute the given task... the catch is that if it runs too long, I want to clean it up. this seemed pretty straight forward with a...
2
by: James Colannino | last post by:
Hey everyone. I'm writing a small application in Python that uses os.fork() to create a separate process in which another application is run in the background. The problem is that I need to know...
3
by: Gil | last post by:
I need to create a web page in which its content should be controlled by some win32 application. this application may add or remove some gif images from the page and it should be smooth as possible...
0
by: jbenezech | last post by:
Hi all , I have a perl/java app running under Win32. The application consists of a perl service (Win32::Daemon) and of java classes. The perl service calls every xx hours java classes to perform...
1
by: chriskent | last post by:
Hi, I have an unusual situation whereby we create a Window during initialisation. We have used this code for many years and have found one unusual case with a customer when the RegiterClass fails...
3
by: Firecore | last post by:
Does anyone know how to use this? I was browsing a few tutorials on the net, and I saw one that shows how to display stuff on the screen. I added a few events. This is my code: #include...
1
by: Tension | last post by:
Hi, I am trying to run a Tornado simulator with Perl. The command line in an ordinary Windows command window looks like this: "C:\Tornado\target\config\simpc\vxWorks.exe /r32000000" Which I...
0
by: Faith0G | last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 3 Apr 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome former...
0
by: ryjfgjl | last post by:
In our work, we often need to import Excel data into databases (such as MySQL, SQL Server, Oracle) for data analysis and processing. Usually, we use database tools like Navicat or the Excel import...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.