开发者

php exec c program in background error

I'm trying to execute a program in the background using php. The c program is this.

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

and the php that runs the program goes like this

<?php
$out = array();
exec('/home/gianpaolo/workspace/test/test 2开发者_如何学C>&1', $out);
print_r($out);
?>

I'm triggering this code using a webpage that has a reference to this code. As you can see I'm printing the variable $out to see what's happening and this is what i get

 Array ( [0] => Segmentation fault )

If I run any command line it works great but if I run this it won't any ideas?

---UPDATE--- I checked as suggested if the fp was NULL which in fact it was. So, how can I grant permission so it can open to write or create to write files?


Check the return value of your fopen call.

I guess that the user which runs the webserver hasn't got enough permissions to write (or even read) the file. If that's the case, fopen will return a NULL pointer.


This is almost certainly because of 2 things

  1. You don't check for failure to open file (i.e. fp is null)
  2. Your web server user (usually www-data or similar) does not have the permissions to open that file

combine those two and you are trying to write to a file you (www-data in this case) don't have permissions to and thus using a NULL pointer in the fwrite call in the C program, dereferencing a NULL pointer in the fwrite call causes a segfault

In short, remember your web server does not run as the same user, with the same permissions as you.

Edit: You will want to use the chmod shell command to grant read & write permissions on the directory to "other" (unless you don't want to let anyone write there, just www-data, in which case you'll need to use chown as well. Strictly speaking this part of the question lives on http://serverfault.com or http://unix.stackexchange.com


Did you check whether fp was NULL when it returned from fopen? As stated here:

If the file has been succesfully opened the function will return a pointer to a FILE object that is used to identify the stream on all further operations involving it. Otherwise, a null pointer is returned.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜