我正在尝试在我的C程序中执行其他程序。我的第一次尝试是与popen。当我尝试从pipe
读取时,我只得到一个字节的回复,而在buf中没有任何内容。我不确定这背后的原因。
popen示例:
#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
非常感谢任何帮助! 谢谢!
答案 0 :(得分:2)
你需要执行php解释器并将脚本的名称作为参数传递,如果你的脚本不有shebang那么使用popen
,因为shell不知道哪个口译员使用:
fp = popen("php /path/to/script/test.php", "r");
如果脚本有shebang行,你可以执行它,因为popen
使用shell来执行命令,它可以找出要使用的命令,所以你可以这样做:
fp = popen("/path/to/script/test.php", "r");
但是,请确保脚本是可执行的:
chmod +x test.php
您也可以使用execl()
,但必须指定二进制文件的路径,因为execl
不使用shell:
execl("/usr/bin/php", "/usr/bin/php", "-q",
"/path/to/script/test.php", (char *) NULL);
不要忘记实际读取管道;)
fread(buf, 1, 1024, pipe);