c - Popen 和 execl 未给出用户定义程序的输出

标签 c exec popen

我正在尝试在我的 C 程序中执行其他程序。我的第一次尝试是使用 popen。当我尝试从 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

对此的任何帮助将不胜感激! 谢谢!

最佳答案

当使用 popen 时,如果您的脚本没有有 shebang,因为 shell 不会',您需要执行 php 解释器并传递脚本名称作为参数不知道使用哪个解释器:

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);

关于c - Popen 和 execl 未给出用户定义程序的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13325149/

相关文章:

c++ - 比较两个数组之和的快速算法?

c编程malloc问题

Java Runtime.exec 在 Linux 中因空间而失败

C++ popen() 参数

c - 带有二进制文件的 C 中的指针

c++ - 在哪里可以找到散列/加密算法的开源实现(头文件)

python - 在 Python 中分析子进程 Popen 调用

python-3.x - 如何同时运行两个脚本

java - (Java) Runtime.exec 中的文件重定向(双向)?

python - 动态过滤 Pandas 数据框