php exec c программа в фоновом режиме ошибка - PullRequest
2 голосов
/ 28 января 2011

Я пытаюсь выполнить программу в фоновом режиме, используя 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 НЕДЕЙСТВИТЕЛЕН, который фактически был. Итак, как я могу предоставить разрешение, чтобы оно могло открываться для записи или создавать для записи файлов?

Ответы [ 3 ]

1 голос
/ 28 января 2011

Это почти наверняка из-за 2 вещей

  1. Вы не проверяете, не удалось ли открыть файл (т. Е. fp имеет значение null)
  2. Пользователь вашего веб-сервера (обычноwww-data или аналогичный) не имеет прав для открытия этого файла

объединить эти два файла, и вы пытаетесь записать файл, который у вас (в данном случае www-data) не имеет разрешенийи, таким образом, использование указателя NULL в вызове fwrite в программе на C, разыменование указателя NULL в вызове fwrite приводит к segfault

Короче, помните, что ваш веб-сервер незапускать от имени того же пользователя с теми же правами, что и вы.

Редактировать: Вы захотите использовать команду оболочки chmod, чтобы предоставить разрешения на чтение и запись в каталоге для «других» (если вы не хотите, чтобы кто-либо писал туда)просто www-data, в этом случае вам также нужно будет использовать chown. Строго говоря, эта часть вопроса касается http://serverfault.com или http://unix.stackexchange.com

1 голос
/ 28 января 2011

Проверьте возвращаемое значение вашего fopen вызова.

Я полагаю, что пользователь, который запускает веб-сервер, не имеет достаточных прав для записи (или даже чтения) файла.В таком случае fopen вернет указатель NULL.

0 голосов
/ 28 января 2011

Вы проверяли, был ли fp НЕДЕЙСТВИТЕЛЕН, когда он вернулся из fopen? Как указано здесь :

Если файл был успешно открыл функцию вернет указатель на используемый объект FILE идентифицировать поток по всему дальше операции, связанные с этим. В противном случае, возвращается нулевой указатель.

...