質問

思を実行するPHPスクリプトからCプログラムお車でお越しの際は、コンテンツCに変更します。

また以下のような作品:

C:

printf("calling php function\n");
execl("/usr/bin/php -q", "/var/www/html/phpinfo.php", NULL);
printf("End php function\n");

PHP:

<?php
echo "hello";
?>

環境:

  • PHP5.2.6
  • Apache2.0
  • Fedora Core10

考えてもその他の方法ではないかと思います。

役に立ちましたか?

解決

答えはこちらを利用 system() または popen()execl().していることジェイソンはすでに掲載してい答えを利用して約 popen(), のんび次の方法などの説明ができるようにな execl() だん。が、これはすべての不必要な技術mumboジャンボがdammit、私はこの入力とし、先に実施いたしましたとして長いプレリュード、お話 popen() やって捨てるのに!

まず...

通話の場合 execl() すべてのコマンドライン引数が必要に渡されます。また、最初の引数として繰り返す必要があります argv[0] 任意のプログラム main() は従来の名前です。なので、固定電話ようになっているでしょう:

execl("/usr/bin/php", "/usr/bin/php", "-q",
    "/var/www/html/phpinfo.php", (char *) NULL);

(I)を追加したキャスト (char *) を確実にするためのnullポインタとして渡された最後の引数の整数は0の場合 NULL うとして定義すること 0 ない (void *) 0, する法律に基づいて行われる。)

しかし...

これを取得します execl() 電話があり、大きな問題です。の exec 家族の機能がほとんどと組み合わせて使用 fork() 一部の複雑な pipe() juggling.これは、 exec 機能のないプログラムを別のプロセス実際に置き換え現在のプロセス!だから呼び出す execl(), は、コードが行われます。終了しました。 execl() なに戻ります。まだのようにまっす必要はありませんに何が起こるか見てみてくださいとしてプログラムは魔法への転換 /usr/bin/php ます。

ですが、この約 fork()pipe()?高水準で、どんなに分割処理の二つのプロセス。親プロセス"であり続けることをご"プロセスを対象として、子プロセスを直ちに execl() への転換 /usr/bin/php.その場合にだけ有線また、人間の親子は、プロセスと正しくはそのコミュニケーションが取れます。

への長い話を短くすれば、まだまだここにいうなずオフについて相談しょoracle Googleのための方法について詳しています。あたっぷりのウェブサイトが与えで(!) 深い内容につい fork/exec 踊りました。

いせんお掛けになってる。この機能を使っていた自分のプログラムとは何かなどについて解説する。であ popen() 実は、この呼び出し側アクセスできる子どもの stderr ストリームのほか、 stdinstdout.

コー---

#include <errno.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

pid_t execute(const char *command, FILE **in, FILE **out, FILE **err)
{
    pid_t pid;
    int   fd[6];

    pipe(&fd[0]);
    pipe(&fd[2]);
    pipe(&fd[4]);

    switch (pid = fork()) {
        case -1:
            perror("unable to fork()");
            exit(1);

        case 0:
            close(fd[1]);   // Close write end of stdin.
            close(fd[2]);   // Close read end of stdout.
            close(fd[4]);   // Close read end of stderr.

            dup2(fd[0], STDIN_FILENO);  // Have stdin read from the first pipe.
            dup2(fd[3], STDOUT_FILENO); // Have stdout write to the second pipe.
            dup2(fd[5], STDERR_FILENO); // Have stderr write to the third pipe.

            execlp("/bin/sh", "/bin/sh", "-c", command, (char *) NULL);

            perror("execlp() failed");
            _exit(1);

        default:
            close(fd[0]); // Close read end of stdin.
            close(fd[3]); // Close write end of stdout.
            close(fd[5]); // Close write end of stderr.

            if (in)  *in  = fdopen(fd[1], "wb"); else close(fd[1]);
            if (out) *out = fdopen(fd[2], "rb"); else close(fd[2]);
            if (err) *err = fdopen(fd[4], "rb"); else close(fd[4]);

            return pid;
    }
}

他のヒント

おそらく最も簡単な方法は、 popenの機能を使用することです: (リンク先のページから抜粋):

  

次の例では、現在のディレクトリ内のファイルの一覧を取得するために、コマンドls *を実行するためにpopen()とpclose()の使用方法を示します:

#include <stdio.h>
...


FILE *fp;
int status;
char path[PATH_MAX];


fp = popen("ls *", "r");
if (fp == NULL)
    /* Handle error */;


while (fgets(path, PATH_MAX, fp) != NULL)
    printf("%s", path);


status = pclose(fp);
if (status == -1) {
    /* Error reported by pclose() */
    ...
} else {
    /* Use macros described under wait() to inspect `status' in order
       to determine success/failure of command executed by popen() */
    ...
}

ただし、Cプログラム内からPHPスクリプトの出力を読みたいと、赤い旗の一種である、と私はこれまで、いくつかのクリーナー、全体的なソリューションは、おそらくそこにある疑いがあるが、それは、より高いレベルの記述なしでより多くを語るのは難しいですあなたが何をしようとしている。

覚えていき execl() で"出口ます。なので、すことができなくなって、"数"ではないがこのコンポーネントです。

この問題を克服するためには、いずれかを使用 system または使用 fork() を子プロセスと子プロセス execl その他の機能から exec 家族です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top