从C程序执行php脚本并将结果存储到变量中
我想从C程序执行
PHP脚本并将返回的内容存储到C变量中.
我试过跟随,但它不起作用: C: printf("calling php functionn"); execl("/usr/bin/php -q","/var/www/html/phpinfo.php",NULL); printf("End php functionn"); PHP: <?php echo "hello"; ?> 环境: > PHP 5.2.6 还建议任何其他更好的方法来做到这一点. 解决方法
这里简短的回答是使用system()或popen()而不是execl().看到Jason已经发布了关于使用popen()的一个很好的答案,我将跳过它并解释如何使用execl()以防你真正关心.最有可能的是,这是所有不必要的技术笨蛋 – 但是该死的,在讨论popen()之前我已经将其中的大部分内容作为一个很长的前奏而且我现在不会丢掉它!
首先… 调用execl()时,所有命令行参数都需要单独传递.此外,第一个参数必须重复,因为任何程序的main()中的argv [0]传统上都是程序的名称.所以固定电话应该是这样的: execl("/usr/bin/php","/usr/bin/php","-q",(char *) NULL); (我将转换添加到(char *)以确保将空指针作为最终参数而不是整数0传递,如果NULL恰好定义为0而不是(void *)0,这是合法的.) 然而… 这会使execl()调用正确,但是存在更大的问题. exec系列函数几乎总是与fork()和一些复杂的管道()杂耍一起使用.这是因为exec函数不在单独的进程中运行程序;他们实际上取代了当前的流程!所以一旦你调用execl(),你的代码就完成了.成品. execl()永远不会返回.如果您只是像调用它一样调用它,那么您将永远不会看到会发生什么,因为您的程序会神奇地转换为/usr/bin/php进程. 好的,那么fork()和pipe()的含义是什么?在高层次上,您需要做的是将流程分为两个流程.父进程将继续是“你的”进程,而子进程将立即调用execl()并将其自身转换为/usr/bin/php.然后,如果您已将父进程和子进程正确连接在一起,则它们将能够相互通信. 长话短说,如果你还在这里并且没有点头,你应该向智慧的oracle谷歌咨询有关所有这些的更多细节.有很多网站提供更多(!)有关如何进行fork / exec舞蹈的深入细节. 我不会离开你的.这是我用于我自己的程序的函数,它完全按照我的概述.它实际上与popen()非常相似,唯一的区别是调用者除了stdin和stdout之外还可以访问子节点的stderr流. 码… #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; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |