php exec c程序在后台错误

时间:2011-01-28 00:37:18

标签: php c command-line background exec

我正在尝试使用php在后台执行程序。 c程序就是这样。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
    printf("hello\n");
    int i =0;
    printf("hello world\n");
    FILE *fp;
    fp = fopen("/home/gianpaolo/workspace/test/outputfile", "w+");

    while(i < 60000000) {
        fprintf(fp, "hello world\n");
        i++;
    }
    fclose(fp);
}

运行该程序的php就像这样

<?php
$out = array();
exec('/home/gianpaolo/workspace/test/test 2>&1', $out);
print_r($out);
?>

我正在使用引用此代码的网页触发此代码。你可以看到我打印变量$ out来看看发生了什么,这就是我得到的

 Array ( [0] => Segmentation fault )

如果我运行任何命令行它运行良好,但如果我运行它,它不会有任何想法吗?

--- --- UPDATE 我检查了建议,如果fp是NULL,实际上它是。那么,我如何授予权限以便它可以打开以写入或创建以写入文件?

3 个答案:

答案 0 :(得分:1)

这几乎可以肯定是因为有两件事

  1. 您不检查打开文件失败(即fp为空)
  2. 您的网络服务器用户(通常是www-data或类似用户)无权打开该文件
  3. 合并这两个,你试图写一个文件你(在这种情况下是www-数据)没有权限,因此在NULL调用中使用fwrite指针C程序在NULL调用中取消引用fwrite指针会导致段错误

    简而言之,请记住您的网络服务器不是以同一个用户身份运行,具有与您相同的权限。

    编辑:您需要使用chmod shell命令授予read&amp; amp;将目录的权限写入“其他”(除非你不想让任何人写在那里,只是www-data,在这种情况下你也需要使用chown。严格说来这部分问题存在于http://serverfault.comhttp://unix.stackexchange.com

答案 1 :(得分:1)

检查fopen来电的返回值。

我猜运行Web服务器的用户没有足够的权限来编写(甚至读取)该文件。如果是这种情况,fopen将返回NULL指针。

答案 2 :(得分:0)

从fopen返回时,你检查fp是否为NULL吗?如上所述here

  

如果文件已成功完成   打开函数会返回一个   指向所使用的FILE对象的指针   进一步识别流   涉及它的操作。 否则,a   返回空指针。