Как поставить ограничение по времени выполнения на G ++? - PullRequest
0 голосов
/ 19 мая 2018

Я использую следующее для компиляции моей программы на C ++.

g++ filename.cpp -o filename.o

Затем я беру входной файл и направляю вывод в другой файл.

filename.o < in.txt > out.txt

Однако иногда код переходит в бесконечный цикл, и я не могу его остановить (я принудительно завершаю .o из Activity Monitor).

Что нужно, чтобы его поставитьвремя выполнения программы, после чего она автоматически прекращает выполнение.Есть ли способ для этого?

Что-то вроде: - g++ filename.cpp -o filename.o [execution_limit_here=10.0s]

Редактировать: - Я создаю пакет Atom, и пользователи будут компилировать и выполнять свой код для определенного набора входных файлов, используя простую комбинацию клавиш.

Так что я не могу заранее предсказать, пойдет ли код в бесконечный цикл.

Ответы [ 2 ]

0 голосов
/ 19 мая 2018
g++ filename.cpp -o filename.o

Очень плохой вкус (даже если это может сработать).По соглашению *.o файлы объектные файлы , не исполняемые файлы, но в вашей команде компиляции fileno.o - это исполняемый файл (т. Е. Произведенный g++) путем компиляции и компоновки.Читайте о вызове GCC .

Я полагаю, вы работаете в Linux или POSIX (например, MacOSX, Android ...)

Я рекомендую

  g++ -Wall -Wextra -g filename.cpp -o filename

В этой команде мы запрашиваем все предупреждения и отладочную информацию, а исполняемый файл называется filename (без запутанного суффикса .o).

Стандартный C ++ не знает об ограничениях по времени, но POSIX (как Linux и MacOSX), и я рекомендую использовать setrlimit (2) с RLIMIT_CPU.Это должно быть закодировано в приложении (вы могли бы вызвать setrlimit на ранних этапах main).

В противном случае закодируйте программу, подобную оболочке (или используйте какой-нибудь скрипт оболочки с ulimit* 1035).*) для запуска вашего исполняемого файла с некоторым ограничением ЦП и / или использования timeout (1) .

См. также time (7) , чтобы понять различные понятия времени.

Но вы действительно должны отладить свою программу (, используя gdb отладчик , чтобы понять ее поведение) до всегда избегатьбесконечные петли .Возможно, вы могли бы использовать некоторые средства таймера (например, setitimer (2) и поймать сигнал SIGALRM (7) ; читайте также signal-safety (7) ) и / или запросите в ваших циклах истекшее реальное время или время процессора (и сравните его с некоторым порогом).

0 голосов
/ 19 мая 2018

Прежде всего, я бы порекомендовал поместить распечатки в вашу программу, чтобы вы могли понять, почему она застревает в бесконечном цикле, и, если вы хотите ограничить время, вы можете установить время запуска с помощью clock () (от ctime) и после каждой итерации сравнивайте текущее время с начальной точкой времени.

...