0

Cプログラム内で他のプログラムを実行しようとしています。私の最初の試みはポペンでした。から読み込もうとするとpipe、1バイトの応答しか得られず、bufには何も返されません。この背後にある理由についてはよくわかりません。

ポペンの例:

#include<stdio.h>
#include<unistd.h>

int main(int argc, char* argv[])
{
        FILE* pipe;
        if ((pipe=(FILE*)popen("./test.php","r"))==NULL)
                printf("this is not working\n");
        char buf[1024] = {'\0'};

        int fd=fileno(pipe);

        int bytes = read(fd, buf, 1024);

        printf("bytes read %d\n", bytes);

        printf("The program: %s\n", buf);
        if(pclose(pipe)<0)
                printf("not working\n");
        return 0;
}

phpの例

#!/usr/bin/php

<?php
echo "THIS IS A TEST THAT WORKED\n";
?>

出力:

bytes read 1
The program:

lsの出力:

ls -l test.php
-rwxr-xr-x+ 1 tpar44 user 62 Nov 10 14:42 test.php

これでどんな助けでも大歓迎です!ありがとう!

4

1 に答える 1

2

popenシェルが使用するインタープリターを認識しないためにスクリプトにシバンがない場合に使用する場合は、phpインタープリターを実行し、スクリプトの名前を引数として渡す必要があります。

fp = popen("php /path/to/script/test.php", "r");

スクリプトにシバン行がある場合popenは、シェルを使用してコマンドを実行し、使用するコマンドを見つけることができるため、スクリプトを実行できます。これにより、次のことが可能になります。

 fp = popen("/path/to/script/test.php", "r");

ただし、スクリプトが実行可能であることを確認してください。

chmod +x test.php

を使用することもできますが、シェルを使用しないexecl()ため、バイナリへのパスを指定する必要があります。execl

execl("/usr/bin/php", "/usr/bin/php", "-q",
      "/path/to/script/test.php", (char *) NULL);

実際にパイプから読み取ることを忘れないでください;)

fread(buf, 1, 1024, pipe);
于 2012-11-10T19:08:18.640 に答える