popen on Windows

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Daniel Klein

    #1

    popen on Windows

    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 <stdio.h>
    main()
    {
    printf ("Hello World!\n");
    }

    And here's the 'popentest.php' code:

    popen test...
    <?php
    $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\wwwr oot\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
  • Janwillem Borleffs

    #2
    Re: popen on Windows

    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


    Comment

    • Vince Morgan

      #3
      Re: popen on Windows

      "Daniel Klein" <danielk@feathe rbrain.netwrote in message
      news:u89qm352ob 3hep0heags7bd82 q3seqcdjb@4ax.c om...
      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 <stdio.h>
      main()
      {
      printf ("Hello World!\n");
      }
      >
      And here's the 'popentest.php' code:
      >
      popen test...
      <?php
      $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\wwwr oot\php>php popentest.php
      popen test...
      Hello World!
      That is because hw.exe is outputting to the consol when it runs I would
      think

      HTH,
      Vince



      Comment

      • Daniel Klein

        #4
        Re: popen on Windows

        On Sun, 23 Dec 2007 13:55:28 +0100, "Janwillem Borleffs"
        <jw@jwscripts.c omwrote:
        >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:\\wind ows\\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

        Comment

        • Vince Morgan

          #5
          Re: popen on Windows

          "Daniel Klein" <danielk@feathe rbrain.netwrote in message
          news:u89qm352ob 3hep0heags7bd82 q3seqcdjb@4ax.c om...
          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 <stdio.h>
          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


          Comment

          • Daniel Klein

            #6
            Re: popen on Windows

            On Mon, 24 Dec 2007 00:06:32 +1000, "Vince Morgan"
            <vinharAtHereop tusnet.com.auwr ote:
            >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\www root\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\\h w.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

            Comment

            • Daniel Klein

              #7
              Re: popen on Windows

              On Mon, 24 Dec 2007 00:44:14 +1000, "Vince Morgan"
              <vinharAtHereop tusnet.com.auwr ote:
              >"Daniel Klein" <danielk@feathe rbrain.netwrote in message
              >news:u89qm352o b3hep0heags7bd8 2q3seqcdjb@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 <stdio.h>
              >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

              Comment

              • Daniel Klein

                #8
                Re: popen on Windows

                On Sun, 23 Dec 2007 14:50:59 GMT, Daniel Klein
                <danielk@feathe rbrain.netwrote :
                >On Mon, 24 Dec 2007 00:44:14 +1000, "Vince Morgan"
                ><vinharAtHereo ptusnet.com.auw rote:
                >
                >>"Daniel Klein" <danielk@feathe rbrain.netwrote in message
                >>news:u89qm352 ob3hep0heags7bd 82q3seqcdjb@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 <stdio.h>
                >>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:

                <?php
                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

                Comment

                • Tim Roberts

                  #9
                  Re: popen on Windows

                  "Vince Morgan" <vinharAtHereop tusnet.com.auwr ote:
                  >"Daniel Klein" <danielk@feathe rbrain.netwrote :
                  >
                  >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 <stdio.h>
                  >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.

                  Comment

                  • Vince Morgan

                    #10
                    Re: popen on Windows

                    "Tim Roberts" <timr@probo.com wrote in message
                    news:ag71n3hb9l sf385c5pdf0k4os 0s9pcjvfn@4ax.c om...
                    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" <vinharAtHereop tusnet.com.auwr ote:
                    [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


                    Comment

                    • Csaba Gabor

                      #11
                      Re: popen on Windows

                      On Dec 23, 11:42 am, Daniel Klein <dani...@feathe rbrain.netwrote :
                      On Sun, 23 Dec 2007 14:50:59 GMT, Daniel Klein
                      >
                      >
                      >
                      <dani...@feathe rbrain.netwrote :
                      On Mon, 24 Dec 2007 00:44:14 +1000, "Vince Morgan"
                      <vinharAtHereop tusnet.com.auwr ote:
                      >
                      >"Daniel Klein" <dani...@feathe rbrain.netwrote in message
                      >news:u89qm352o b3hep0heags7bd8 2q3seqcdjb@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 <stdio.h>
                      >main()
                      >{
                      > printf ("Hello World!\n");
                      >}
                      >
                      Just to be thorough, I created a php script:
                      >
                      <?php
                      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_conten ts(...) 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:

                      <?php
                      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_pum p(200); }
                      pclose ($proc);
                      return $out; }

                      $cmnd = "SchTasks";
                      $out = getPOpenOutput ($cmnd);
                      print "<pre>$out</pre>";
                      ?>

                      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

                      Comment

                      • Daniel Klein

                        #12
                        Re: popen on Windows

                        On Tue, 25 Dec 2007 12:22:33 -0800 (PST), Csaba Gabor
                        <danswer@gmail. comwrote:
                        >On Dec 23, 11:42 am, Daniel Klein <dani...@feathe rbrain.netwrote :
                        >On Sun, 23 Dec 2007 14:50:59 GMT, Daniel Klein
                        >>
                        >>
                        >>
                        ><dani...@feath erbrain.netwrot e:
                        >On Mon, 24 Dec 2007 00:44:14 +1000, "Vince Morgan"
                        ><vinharAtHereo ptusnet.com.auw rote:
                        >>
                        >>"Daniel Klein" <dani...@feathe rbrain.netwrote in message
                        >>news:u89qm352 ob3hep0heags7bd 82q3seqcdjb@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 <stdio.h>
                        >>main()
                        >>{
                        >> printf ("Hello World!\n");
                        >>}
                        >>
                        >Just to be thorough, I created a php script:
                        >>
                        ><?php
                        >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_conten ts(...) 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:
                        >
                        ><?php
                        >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_pum p(200); }
                        pclose ($proc);
                        return $out; }
                        >
                        >$cmnd = "SchTasks";
                        >$out = getPOpenOutput ($cmnd);
                        >print "<pre>$out</pre>";
                        >?>
                        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

                        Comment

                        • Jerry Stuckle

                          #13
                          Re: popen on Windows

                          Vince Morgan wrote:
                          "Daniel Klein" <danielk@feathe rbrain.netwrote in message
                          news:u89qm352ob 3hep0heags7bd82 q3seqcdjb@4ax.c om...
                          >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 <stdio.h>
                          >main()
                          >{
                          > printf ("Hello World!\n");
                          >}
                          >>
                          >And here's the 'popentest.php' code:
                          >>
                          >popen test...
                          ><?php
                          > $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\www root\php>php popentest.php
                          >popen test...
                          >Hello World!
                          That is because hw.exe is outputting to the consol when it runs I would
                          think

                          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@attgl obal.net
                          =============== ===

                          Comment

                          • Jerry Stuckle

                            #14
                            Re: popen on Windows

                            Vince Morgan wrote:
                            "Tim Roberts" <timr@probo.com wrote in message
                            news:ag71n3hb9l sf385c5pdf0k4os 0s9pcjvfn@4ax.c om...
                            >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" <vinharAtHereop tusnet.com.auwr ote:
                            [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@attgl obal.net
                            =============== ===

                            Comment

                            • Jerry Stuckle

                              #15
                              Re: popen on Windows

                              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 <stdio.h>
                              main()
                              {
                              printf ("Hello World!\n");
                              }
                              >
                              And here's the 'popentest.php' code:
                              >
                              popen test...
                              <?php
                              $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\wwwr oot\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@attgl obal.net
                              =============== ===

                              Comment

                              Working...