popen on Windows
am 22.12.2007 16:02:37 von Daniel Klein
I'm trying to get popen to work on Windows.
Here's a simplified example of what I'm trying to get working:
I have a hw.c program as follows:
#include
main()
{
printf ("Hello World!\n");
}
And here's the 'popentest.php' code:
popen test...
$fp = popen('C:\\home\\bin\\hw.exe', 'r');
$data = fread($fp, 1024);
pclose($fp);
echo $data;
?>
It works when I run this from a command prompt:
C:\Inetpub\wwwroot\php>php popentest.php
popen test...
Hello World!
All I get in a web browser is:
popen test...
What am I missing?
Thanks
Daniel Klein
Re: popen on Windows
am 23.12.2007 13:55:28 von Janwillem Borleffs
Daniel Klein wrote:
> All I get in a web browser is:
>
> popen test...
>
> What am I missing?
>
It's possible that the program only executes from a shell. In this case you
should start popen with a command shell (cmd, r+w) and call your program
from there.
JW
Re: popen on Windows
am 23.12.2007 15:06:32 von Vince Morgan
"Daniel Klein" wrote in message
news:u89qm352ob3hep0heags7bd82q3seqcdjb@4ax.com...
> I'm trying to get popen to work on Windows.
>
> Here's a simplified example of what I'm trying to get working:
>
> I have a hw.c program as follows:
>
> #include
> main()
> {
> printf ("Hello World!\n");
> }
>
> And here's the 'popentest.php' code:
>
> popen test...
>
> $fp = popen('C:\\home\\bin\\hw.exe', 'r');
> $data = fread($fp, 1024);
According to the manual the file pointer that is returned by "popen()" can
be used by the following, fgets(), fgetss(), and fwrite() whereas you are
calling "fread()".
> It works when I run this from a command prompt:
>
> C:\Inetpub\wwwroot\php>php popentest.php
> popen test...
> Hello World!
That is because hw.exe is outputting to the consol when it runs I would
think
http://www.php.net/popen
HTH,
Vince
Re: popen on Windows
am 23.12.2007 15:26:22 von Daniel Klein
On Sun, 23 Dec 2007 13:55:28 +0100, "Janwillem Borleffs"
wrote:
>Daniel Klein wrote:
>> All I get in a web browser is:
>>
>> popen test...
>>
>> What am I missing?
>>
>
>It's possible that the program only executes from a shell. In this case you
>should start popen with a command shell (cmd, r+w) and call your program
>from there.
Thanks for the suggestion. I changed the code to:
$fp = popen('C:\\windows\\system32\\cmd.exe /c
C:\\home\\bin\\hw.exe', 'r+w');
but this made no difference; iow it works from a command prompt but
not in a web browser (I tried it with IE, Firefox and Opera).
I might add that I made sure that permissions on the executable were
wide open eg: full Full Control to 'Everyone'.
Does anyone out there have popen (or proc_open) working on
Windows/IIS?
If I cannot get this working then my next step will be to try it with
Apache; trouble is that I have not ever used it so it will certainly
be a learning experience for me. However, I would really like to get
it working with IIS, if at all possible.
Daniel Klein
Re: popen on Windows
am 23.12.2007 15:43:59 von Daniel Klein
On Mon, 24 Dec 2007 00:06:32 +1000, "Vince Morgan"
wrote:
>According to the manual the file pointer that is returned by "popen()" can
>be used by the following, fgets(), fgetss(), and fwrite() whereas you are
>calling "fread()".
>
>> It works when I run this from a command prompt:
>>
>> C:\Inetpub\wwwroot\php>php popentest.php
>> popen test...
>> Hello World!
>That is because hw.exe is outputting to the consol when it runs I would
>think
>http://www.php.net/popen
Good catch. I changed the code to:
$fp = popen("cmd /c c:\\home\\cp\\hw.exe", "r+w");
$myline = fgets($fp);
pclose($fp);
echo $myline;
which envokes the program via 'cmd', but it still does not work in a
web browser :-(
I have already Google'd this to death and cannot find anything that
helps.
Daniel Klein
Re: popen on Windows
am 23.12.2007 15:44:14 von Vince Morgan
"Daniel Klein" wrote in message
news:u89qm352ob3hep0heags7bd82q3seqcdjb@4ax.com...
> I'm trying to get popen to work on Windows.
>
> Here's a simplified example of what I'm trying to get working:
>
> I have a hw.c program as follows:
>
> #include
> main()
> {
> printf ("Hello World!\n");
> }
>
> And here's the 'popentest.php' code:
>
I could be wrong, but "printf()" is going to want to output to a consul, and
I can't see how you are going to capture the output via "popen()" which is
expecting a file pointer. You need to capture the output as a string so
that it can be output to the server as HTML or whatever. However you cannot
return a string from a C executable.
HTH
Vince
Re: popen on Windows
am 23.12.2007 15:50:59 von Daniel Klein
On Mon, 24 Dec 2007 00:44:14 +1000, "Vince Morgan"
wrote:
>"Daniel Klein" wrote in message
>news:u89qm352ob3hep0heags7bd82q3seqcdjb@4ax.com...
>> I'm trying to get popen to work on Windows.
>>
>> Here's a simplified example of what I'm trying to get working:
>>
>> I have a hw.c program as follows:
>>
>> #include
>> main()
>> {
>> printf ("Hello World!\n");
>> }
>>
>> And here's the 'popentest.php' code:
>>
>I could be wrong, but "printf()" is going to want to output to a consul, and
>I can't see how you are going to capture the output via "popen()" which is
>expecting a file pointer. You need to capture the output as a string so
>that it can be output to the server as HTML or whatever. However you cannot
>return a string from a C executable.
'printf()' is sending the output, as a string, to STDOUT so I would
think 'popen()' / 'fgets()' should be able to handle that.
Can anyone else substantiate this?
Daniel Klein
Re: popen on Windows
am 23.12.2007 20:42:07 von Daniel Klein
On Sun, 23 Dec 2007 14:50:59 GMT, Daniel Klein
wrote:
>On Mon, 24 Dec 2007 00:44:14 +1000, "Vince Morgan"
> wrote:
>
>>"Daniel Klein" wrote in message
>>news:u89qm352ob3hep0heags7bd82q3seqcdjb@4ax.com...
>>> I'm trying to get popen to work on Windows.
>>>
>>> Here's a simplified example of what I'm trying to get working:
>>>
>>> I have a hw.c program as follows:
>>>
>>> #include
>>> main()
>>> {
>>> printf ("Hello World!\n");
>>> }
>>>
>>> And here's the 'popentest.php' code:
>>>
>>I could be wrong, but "printf()" is going to want to output to a consul, and
>>I can't see how you are going to capture the output via "popen()" which is
>>expecting a file pointer. You need to capture the output as a string so
>>that it can be output to the server as HTML or whatever. However you cannot
>>return a string from a C executable.
>
>'printf()' is sending the output, as a string, to STDOUT so I would
>think 'popen()' / 'fgets()' should be able to handle that.
Just to be thorough, I created a php script:
echo "Hi";
?>
and replaced the 'hw.exe' with 'php hi.php' - I got the same problem
as originally reported.
I also tested 'php pipetest.php' from a telnet session, which (I
think) proves that it does not require a 'console'.
I'm getting to the point where I'm wondering if this is a Windows
limitation, but I do not have a unix-like box to test out this theory.
Daniel Klein
Re: popen on Windows
am 25.12.2007 07:09:59 von Tim Roberts
"Vince Morgan" wrote:
>"Daniel Klein" wrote:
>
>> I'm trying to get popen to work on Windows.
>>
>> Here's a simplified example of what I'm trying to get working:
>>
>> I have a hw.c program as follows:
>>
>> #include
>> main()
>> {
>> printf ("Hello World!\n");
>> }
>>
>> And here's the 'popentest.php' code:
>>
>I could be wrong, but "printf()" is going to want to output to a consul, and
>I can't see how you are going to capture the output via "popen()" which is
>expecting a file pointer.
You are wrong. "printf" writes to stdout. If you run it from a console,
then stdout is connected to the console, but that's certainly not the only
option. If you type:
hw > xxx.txt
then clearly "printf" is not going to the console.
popen runs the program with stdin and stdout redirected to the calling
program. The program as he describes it should work, assuming the PHP
popen is correctly implemented on Windows.
Your suggestion about fread is also off the mark. Any of the stdio
functions will work.
>You need to capture the output as a string so
>that it can be output to the server as HTML or whatever. However you cannot
>return a string from a C executable.
Not so. Perhaps you should hold off on replying until you are in more
familiar territory.
--
Tim Roberts, timr@probo.com
Providenza & Boekelheide, Inc.
Re: popen on Windows
am 25.12.2007 08:15:33 von Vince Morgan
"Tim Roberts" wrote in message
news:ag71n3hb9lsf385c5pdf0k4os0s9pcjvfn@4ax.com...
> You are wrong. "printf" writes to stdout. If you run it from a console,
> then stdout is connected to the console, but that's certainly not the only
> option. If you type:
> hw > xxx.txt
> then clearly "printf" is not going to the console.
Clearly, thank you.
> Your suggestion about fread is also off the mark. Any of the stdio
> functions will work.
>>> "Vince Morgan" wrote:
[snip]
>>>According to the manual the file pointer that is returned by "popen()"
can
>>>be used by the following, fgets(), fgetss(), and fwrite() whereas you are
>>>calling "fread()".
[snip]
What suggestion was that? I can't see it in the above. You have another
source?
>
> >You need to capture the output as a string so
> >that it can be output to the server as HTML or whatever. However you
cannot
> >return a string from a C executable.
Ooops, pipes.
>
> Not so. Perhaps you should hold off on replying until you are in more
> familiar territory.
My appologies to Daniel.
I see your ego is much larger than you manners..
Regards,
Vince Morgan
Re: popen on Windows
am 25.12.2007 21:22:33 von Csaba Gabor
On Dec 23, 11:42 am, Daniel Klein wrote:
> On Sun, 23 Dec 2007 14:50:59 GMT, Daniel Klein
>
>
>
> wrote:
> >On Mon, 24 Dec 2007 00:44:14 +1000, "Vince Morgan"
> > wrote:
>
> >>"Daniel Klein" wrote in message
> >>news:u89qm352ob3hep0heags7bd82q3seqcdjb@4ax.com...
> >>> I'm trying to get popen to work on Windows.
>
> >>> Here's a simplified example of what I'm trying to get working:
>
> >>> I have a hw.c program as follows:
>
> >>> #include
> >>> main()
> >>> {
> >>> printf ("Hello World!\n");
> >>> }
>
> Just to be thorough, I created a php script:
>
>
> echo "Hi";
> ?>
>
> and replaced the 'hw.exe' with 'php hi.php' - I got the same problem
> as originally reported.
There are usually two issues with this type of code: (1) Is anything
getting executed at all? (2) Collecting the output. To verify that
(1) is working, you could use a file_put_contents(...) together with
date(...)
Also, popen has undergone changes in the last year so if you are
working with an older version of php (perhaps 5.1 or earlier?) things
may be slightly different.
Here is an example of collecting output from popen that works in a web
server context for me:
function getPOpenOutput ($cmd) {
$out = "";
$proc = popen ($cmd, "r");
while (!feof($proc)) { // wait for output to finish
$slurp = fgets($proc, 256);
if (strlen($slurp)>0) $out .= $slurp;
else com_message_pump(200); }
pclose ($proc);
return $out; }
$cmnd = "SchTasks";
$out = getPOpenOutput ($cmnd);
print "$out
";
?>
You may have to set the web server to
"Allow service to interact with the Desktop",
which is found under Control Panel \ Services
Finally, if you are calling on more complicated
programs, you may need to escape characters
like double quotes, <, >, ^, et. al) within
$cmnd, which can be non trivial. For example:
$cmnd = "php -r echo('hi');";
but
$cmnd = "php -r \"echo('hi there');\"";
Csaba Gabor from Vancouver
Re: popen on Windows
am 26.12.2007 17:27:09 von Daniel Klein
On Tue, 25 Dec 2007 12:22:33 -0800 (PST), Csaba Gabor
wrote:
>On Dec 23, 11:42 am, Daniel Klein wrote:
>> On Sun, 23 Dec 2007 14:50:59 GMT, Daniel Klein
>>
>>
>>
>> wrote:
>> >On Mon, 24 Dec 2007 00:44:14 +1000, "Vince Morgan"
>> > wrote:
>>
>> >>"Daniel Klein" wrote in message
>> >>news:u89qm352ob3hep0heags7bd82q3seqcdjb@4ax.com...
>> >>> I'm trying to get popen to work on Windows.
>>
>> >>> Here's a simplified example of what I'm trying to get working:
>>
>> >>> I have a hw.c program as follows:
>>
>> >>> #include
>> >>> main()
>> >>> {
>> >>> printf ("Hello World!\n");
>> >>> }
>>
>> Just to be thorough, I created a php script:
>>
>>
>> echo "Hi";
>> ?>
>>
>> and replaced the 'hw.exe' with 'php hi.php' - I got the same problem
>> as originally reported.
>
>There are usually two issues with this type of code: (1) Is anything
>getting executed at all? (2) Collecting the output. To verify that
>(1) is working, you could use a file_put_contents(...) together with
>date(...)
I turned on error reporting and it appears that the popen is not
getting executed at all. I replaced the executable with one that
writes out a small file and it did not even get called. To be sure, I
ran the php code from CLI and sure enuf it ran fine.
>Also, popen has undergone changes in the last year so if you are
>working with an older version of php (perhaps 5.1 or earlier?) things
>may be slightly different.
I'm running PHP 5.2.5.
>Here is an example of collecting output from popen that works in a web
>server context for me:
>
>
>function getPOpenOutput ($cmd) {
> $out = "";
> $proc = popen ($cmd, "r");
> while (!feof($proc)) { // wait for output to finish
> $slurp = fgets($proc, 256);
> if (strlen($slurp)>0) $out .= $slurp;
> else com_message_pump(200); }
> pclose ($proc);
> return $out; }
>
>$cmnd = "SchTasks";
>$out = getPOpenOutput ($cmnd);
>print "$out
";
>?>
Thanks for this code.
>You may have to set the web server to
>"Allow service to interact with the Desktop",
>which is found under Control Panel \ Services
Yes, I had already done this (should have mentioned it in my post so
as to not have to cover 'old' ground, sorry).
>Finally, if you are calling on more complicated
>programs, you may need to escape characters
>like double quotes, <, >, ^, et. al) within
>$cmnd, which can be non trivial. For example:
>$cmnd = "php -r echo('hi');";
>but
>$cmnd = "php -r \"echo('hi there');\"";
Good point!
***
Btw, I have since installed Apache 2.2 and this has resolved the issue
(nice way to spend the holiday, don't you think ;-). Again, I had to
make sure that the service was able to interact with the desktop and
that the process has the appropriate executable permissions.
In conclusion, the ability to use 'popen' or 'proc_open' or 'back
tics' on Windows appears to be a Windows/IIS limitation /
security-feature(?) / bug(?) / whatever...
Hope this conversation will be of use to others attempting the
'impossible' on Windows.
Daniel Klein
Cuyahoga Falls, OH
Re: popen on Windows
am 28.12.2007 03:39:31 von Jerry Stuckle
Vince Morgan wrote:
> "Daniel Klein" wrote in message
> news:u89qm352ob3hep0heags7bd82q3seqcdjb@4ax.com...
>> I'm trying to get popen to work on Windows.
>>
>> Here's a simplified example of what I'm trying to get working:
>>
>> I have a hw.c program as follows:
>>
>> #include
>> main()
>> {
>> printf ("Hello World!\n");
>> }
>>
>> And here's the 'popentest.php' code:
>>
>> popen test...
>>
>> $fp = popen('C:\\home\\bin\\hw.exe', 'r');
>> $data = fread($fp, 1024);
>
> According to the manual the file pointer that is returned by "popen()" can
> be used by the following, fgets(), fgetss(), and fwrite() whereas you are
> calling "fread()".
>
Not a problem. fread() can use the handle returned by popen() also.
See further down where there is an example of that.
>> It works when I run this from a command prompt:
>>
>> C:\Inetpub\wwwroot\php>php popentest.php
>> popen test...
>> Hello World!
> That is because hw.exe is outputting to the consol when it runs I would
> think
> http://www.php.net/popen
> HTH,
> Vince
>
>
>
Not knowing what hw.exe is doing, it's hard to say.
--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
jstucklex@attglobal.net
==================
Re: popen on Windows
am 28.12.2007 03:42:30 von Jerry Stuckle
Vince Morgan wrote:
> "Tim Roberts" wrote in message
> news:ag71n3hb9lsf385c5pdf0k4os0s9pcjvfn@4ax.com...
>> You are wrong. "printf" writes to stdout. If you run it from a console,
>> then stdout is connected to the console, but that's certainly not the only
>> option. If you type:
>> hw > xxx.txt
>> then clearly "printf" is not going to the console.
>
> Clearly, thank you.
>
>> Your suggestion about fread is also off the mark. Any of the stdio
>> functions will work.
>
>>>> "Vince Morgan" wrote:
> [snip]
>>>> According to the manual the file pointer that is returned by "popen()"
> can
>>>> be used by the following, fgets(), fgetss(), and fwrite() whereas you are
>>>> calling "fread()".
> [snip]
>
> What suggestion was that? I can't see it in the above. You have another
> source?
>
>>> You need to capture the output as a string so
>>> that it can be output to the server as HTML or whatever. However you
> cannot
>>> return a string from a C executable.
> Ooops, pipes.
>> Not so. Perhaps you should hold off on replying until you are in more
>> familiar territory.
>
> My appologies to Daniel.
>
> I see your ego is much larger than you manners..
> Regards,
> Vince Morgan
>
>
>
Sorry, Vince. I agree with Tim. You're grasping at straws here.
--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
jstucklex@attglobal.net
==================
Re: popen on Windows
am 28.12.2007 03:43:27 von Jerry Stuckle
Daniel Klein wrote:
> I'm trying to get popen to work on Windows.
>
> Here's a simplified example of what I'm trying to get working:
>
> I have a hw.c program as follows:
>
> #include
> main()
> {
> printf ("Hello World!\n");
> }
>
> And here's the 'popentest.php' code:
>
> popen test...
>
> $fp = popen('C:\\home\\bin\\hw.exe', 'r');
> $data = fread($fp, 1024);
> pclose($fp);
> echo $data;
> ?>
>
> It works when I run this from a command prompt:
>
> C:\Inetpub\wwwroot\php>php popentest.php
> popen test...
> Hello World!
>
> All I get in a web browser is:
>
> popen test...
>
> What am I missing?
>
> Thanks
> Daniel Klein
>
Daniel,
On question - does the web server user have permission to execute the
file? Have you verified this?
--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
jstucklex@attglobal.net
==================
Re: popen on Windows
am 28.12.2007 09:28:23 von Vince Morgan
"Jerry Stuckle" wrote in message
news:i8SdnXF43P9d_-nanZ2dnUVZ_uDinZ2d@comcast.com...
> >>>> "Vince Morgan" wrote:
> > [snip]
> >>>> According to the manual the file pointer that is returned by
"popen()"
> > can
> >>>> be used by the following, fgets(), fgetss(), and fwrite() whereas you
are
> >>>> calling "fread()".
> > [snip]
>
> Sorry, Vince. I agree with Tim. You're grasping at straws here.
I "almost" agree with that assesment Jerry. However, what I wrote above is
what is in the current manual. However, if I had read further I would have
discovered it was deficient.
[quote]
This pointer may be used with fgets(), fgetss(), and fwrite().
[/quote]
I was only stating what the manual says, not suggesting anything in that
respect. If quoting from the manual is a "suggestion" as opposed to an
observation I agree totaly. That they are all I/O functions should have
been obvious to me also, but I missed that too @@
Having said that I agree Tim was right that I should have stayed out of it.
And I apologise for my testy reply.
Highest regards,
Vince