Я пытаюсь сделать онлайн-судья написанным 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-скрипте – хорошая идея.