【问题标题】:Popen and execl not giving the output of the user defined programPopen 和 execl 没有给出用户定义程序的输出
【发布时间】:2012-11-10 19:03:46
【问题描述】:

我正在尝试在我的 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

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

【问题讨论】:

  • 还是没发现问题,请问可以添加输出吗?
  • @mux 我也没有,这就是为什么我现在如此困惑
  • 这可能看起来很傻,但是您是否重新编译了代码:)?
  • @mux haha​​ 是的,我什至从以前的编译中删除了旧的可执行文件,以防万一...我还将上面的代码复制并粘贴到一个新文件中,以防万一都不起作用
  • @mux 即使 popen 创建了一个管道,来自 php 脚本的输出注定要用于 stdout 是否重要?该输出是否自动重定向到管道? (我认为这是真的,但现在我不太确定)

标签: c exec popen


【解决方案1】:

您需要执行 php 解释器并将脚本的名称作为参数传递,当使用 popen 时,如果您的脚本 没有 有 shebang,因为 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);

【讨论】:

  • 哦!当 shebang 被包含在第一行时,这甚至是真的吗?
  • @tpar44 这将使用 php 解释器执行脚本,它将忽略第一行,如果您希望可以使用 bash 来执行它,它将运行 php。
  • 非常感谢您的帮助,但是当 c 程序完成执行时,我仍然没有看到 php 脚本的输出...我没有正确地从管道中读取吗?
  • 对不起,我在发布时把它拿出来了,我修复了 popen 的例子,但我知道 execl 没有明确地从管道中读取,但它重复了 stdin、stdout 和 stderr,所以不必明确阅读
  • @tpar44 刚刚测试了 popen 示例,它可以正常工作,就像我说的,别忘了让脚本 executable
猜你喜欢
  • 2012-09-07
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 2021-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多