Принятие Вас имеет сервер Linux и корневой доступ, пробует это. Это - простое решение, которое я нашел.
Создают новый каталог для следующих файлов и дают ему полные полномочия. (Мы можем сделать его более безопасным позже.)
mkdir test
chmod -R 777 test
cd test
Помещенный это в файл, названный bgping
.
echo starting bgping
ping -c 15 www.google.com > dump.txt &
echo ending bgping
Примечание &
. Команда ping будет работать в фоновом режиме, в то время как текущий процесс идет дальше к команде эха. Это проверит с помощью ping-запросов www.google.com 15 раз, который займет приблизительно 15 секунд.
Делают его исполняемым файлом.
chmod 777 bgping
Помещенный это в файл, названный bgtest.php
.
<?php
echo "start bgtest.php\n";
exec('./bgping', $output, $result)."\n";
echo "output:".print_r($output,true)."\n";
echo "result:".print_r($result,true)."\n";
echo "end bgtest.php\n";
?>
, Когда Вы запрашиваете bgtest.php в своем браузере, необходимо получить следующий ответ быстро, не ожидая приблизительно 15 секунд команды ping для завершения.
start bgtest.php
output:Array
(
[0] => starting bgping
[1] => ending bgping
)
result:0
end bgtest.php
команда ping должна теперь работать на сервере. Вместо команды ping Вы могли выполнить Сценарий PHP:
php -n -f largejob.php > dump.txt &
Hope это помогает!
Кажется, вы можете создавать массивы переменной длины, поэтому вы работаете в системе C99 или в системе, которая ее поддерживает. Но не все компиляторы их поддерживают. Если вы хотите их использовать, вам не нужно объявление указателя arr
в вашей структуре. Предполагая, что нет массивов переменной длины, давайте посмотрим на соответствующие части вашего кода:
/*data for each image*/
typedef struct
{
int height;
int width;
pixelStruct *arr; /*pointer to 2-d array of pixels*/
} imageStruct;
arr
- это указатель на pixelStruct
, а не на двумерный массив пикселей. Конечно, вы можете использовать arr
для доступа к такому массиву, но комментарий вводит в заблуждение и намекает на недоразумение. Если вы действительно хотите объявить такую переменную, сделайте что-то вроде:
pixelStruct (*arr)[2][3];
и arr
будет указателем на «массив 2 из массива 3 из pixelStruct», что означает, что arr
указывает на двумерный массив. Это не совсем то, что вам нужно. Честно говоря, вы не об этом заявляете, так что все хорошо. Но ваш комментарий предполагает неправильное понимание указателей в C, и это проявляется позже в вашем коде.
На этом этапе вам будет полезно прочитать хорошее введение в массивы и указатели в C, и действительно хорошее C для умников: массивы и указатели Криса Торека. В частности, убедитесь, что вы понимаете первую диаграмму на странице и все, что есть в определении функции f
.
Поскольку вы хотите иметь возможность индексировать arr
в Естественным образом используя индексы «столбец» и «строка», я предлагаю вам объявить arr
как указатель на указатель. Итак, ваша структура становится:
/* data for each image */
typedef struct
{
int height;
int width;
pixelStruct **arr; /* Image data of height*width dimensions */
} imageStruct;
Затем в вашей функции ReadImage
вы выделяете необходимую память:
int i;
thisImage.arr = malloc(thisImage.height * sizeof *thisImage.arr);
for (i=0; i < thisImage.height; ++i)
thisImage.arr[i] = malloc(thisImage.width * sizeof *thisImage.arr[i]);
Обратите внимание, что для ясности я не проверял ошибки на malloc
. На практике вам следует проверить, вернул ли malloc
NULL
, и принять соответствующие меры.
Предполагая, что вся память выделена успешно, теперь вы можете прочитать свое изображение в thisImage.arr
(точно так же, как вы делали для imageArr
в исходной функции).
Как только вы закончите с thisImage.arr
, обязательно освободите его:
for (i=0; i < thisImage.height; ++i)
free(thisImage.arr[i]);
free(thisImage.arr);
На практике вам может потребоваться обернуть указанные выше части выделения и освобождения в соответствующие функции, которые выделяют и освобождают объект arr
, и заботятся о проверке ошибок.
int i;
thisImage.arr = malloc(thisImage.height * sizeof *thisImage.arr);
for (i=0; i < thisImage.height; ++i)
thisImage.arr[i] = malloc(thisImage.width * sizeof *thisImage.arr[i]);
Обратите внимание, что для ясности я не проверял ошибки на malloc
. На практике вы должны проверить, вернул ли malloc
NULL
, и принять соответствующие меры.
Если вся память выделена успешно, теперь вы можете прочитать свое изображение в thisImage.arr
(точно так же, как вы делали для imageArr
в исходной функции).
Как только вы закончите с thisImage.arr
, обязательно освободите его:
for (i=0; i < thisImage.height; ++i)
free(thisImage.arr[i]);
free(thisImage.arr);
На практике вам может потребоваться обернуть указанные выше части выделения и освобождения в соответствующие функции, которые выделяют и освобождают объект arr
, и заботятся о проверке ошибок.
int i;
thisImage.arr = malloc(thisImage.height * sizeof *thisImage.arr);
for (i=0; i < thisImage.height; ++i)
thisImage.arr[i] = malloc(thisImage.width * sizeof *thisImage.arr[i]);
Обратите внимание, что для ясности я не проверял ошибки на malloc
. На практике вы должны проверить, вернул ли malloc
NULL
, и принять соответствующие меры.
Если вся память выделена успешно, теперь вы можете прочитать свое изображение в thisImage.arr
(точно так же, как вы делали для imageArr
в исходной функции).
Как только вы закончите с thisImage.arr
, обязательно освободите его:
for (i=0; i < thisImage.height; ++i)
free(thisImage.arr[i]);
free(thisImage.arr);
На практике вам может потребоваться обернуть указанные выше части выделения и освобождения в соответствующие функции, которые выделяют и освобождают объект arr
, и заботятся о проверке ошибок.
Я не думаю, что sizeof imageArr
работает так, как вы ожидаете, когда вы используете массивы размера времени выполнения. Которые, кстати, являются своего рода "нишевой" функцией C99. Вам следует добавить несколько распечаток важных значений, таких как sizeof
, чтобы увидеть, делает ли он то, что вы думаете.
Более ясным было бы использовать явное выделение массива:
thisImage.arr = malloc(thisImage.width * thisImage.height * sizeof *thisImage.arr);
Я также думаю, что это трудно (если даже возможно) реализовать такой "настоящий" 2D-массив. Я бы рекомендовал просто выполнить вычисление адреса самостоятельно, то есть получить доступ к пикселю, подобному этому:
unsigned int x = 3, y = 1; // Assume image is larger.
print("pixel at (%d,%d) is r=%d g=%d b=%d\n", x, y, thisImage.arr[y * thisImage.width + x]);
Я не понимаю, как требуемая информация измерения может быть связана с массивом во время выполнения; Я не думаю, что это возможно.
высота и ширина не определены; вы можете сначала инициализировать их, как в
thisImage.height = 10; thisImage.width = 20;
также,
* thisImage.arr = * imageArr; / * поместите imageArr в thisImage imagestruct *
Это не сработает. Вы должны объявить arr как colorRGB **
, выделить его соответствующим образом и т. Д.
похоже, вы пытаетесь скопировать массив по назначению. Вы не можете использовать для этого простой оператор присваивания, вы должны использовать некоторую функцию для копирования вещей, например memcpy.
*thisImage.arr = *imageArr;
thisimage.arr[0] = imagearr[0];
Вышеупомянутые операторы делают то же самое. Однако вряд ли это вызывает повреждение памяти
, поскольку вы работаете с двумерными массивами, убедитесь, что вы правильно их инициализировали. Глядя на код, не следует даже компилировать: массив объявлен как одномерный в структуре вашего изображения, а вы называете его двумерным?