Я пытаюсь сделать онлайн-судья написанным PHP. В настоящее время мой код выглядит так:
exec("gcc /var/www/qwerty.c -o /var/www/binary",$output,$returnval); print_r($output); exec("cat /var/www/qwe.txt | /var/www/binary",$output,$returnval); print_r($output);
Тем не менее, я хочу, чтобы каждый процесс, порожденный exec выполнял не более 1 секунды. Я не уверен, как это сделать. set_time_limit () не работает
Я бы использовал функции proc_ предложенные @Adam Wright, но быстрой альтернативой Linux-подобным средам является использование команды timeout GNU перед вашей командой:
// If it took more than 1 second, $returnval will got the exit code 124 exec('timeout 1 gcc /var/www/qwerty.c -o /var/www/binary', $output, $returnval);
Вы можете использовать ulimit для этого:
exec(" ( ulimit -t 1 ; gcc ... | /var/www/binary) ");
Это, конечно, работает только в том случае, если процесс использует активное процессорное время, а не если он ожидает ввода-вывода бесконечно.
Это может быть достигнуто с proc_ семейства функций proc_ . Запустите процессы с помощью proc_open . Неоднократно опроса, используя proc_status (с небольшим сном между опросами) до тех пор, пока процесс не вернется или не пройдет 1 секунда. Если 1 секунда проходит без proc_status показывая, что процесс завершен, используйте proc_terminate (или proc_close ), чтобы убить его, и предпримите соответствующие действия.
Я не говорю, что нереста внешних процессов в PHP-скрипте – хорошая идея.