2014-06-05 3 views
1

Я хотел запустить код (или внешний исполняемый файл) в течение определенного количества времени. Например, в Fortran я могуЗапуск части программы внутри кода Fortran в течение ограниченного времени

call system('./run') 

Есть ли способ я могу ограничить свой бег, чтобы, скажем, 10 секунд, например, следующим образом

call system('./run', 10) 

Я хочу сделать это внутри Fortran коды , пример выше для системной команды, но я хочу сделать это также для некоторых других подпрограмм моего кода. например,

call performComputation(10) 

, где performComputing будет работать только 10 секунд. Системой, на которой он будет работать, является Linux.

спасибо!

+0

Какой язык вы звоните? –

+0

И на какой платформе вы работаете? –

+0

@MarkSetchell обновленный вопрос – user2945166

ответ

2

EDITED

Ах, я вижу - вы хотите позвонить частью текущей программы ограниченное время. Я вижу несколько вариантов, которые ...

Варианта 1

Измените подпрограммы, которые вы хотите работать в течение ограниченного времени, поэтому они берут дополнительный параметр, который является количеством секунд, они могут работать , Затем измените подпрограмму, чтобы получить системное время в начале, а затем в своем цикле обработки снова получите время и выйдете из цикла и вернитесь к вызывающему абоненту, если разница во времени превысит максимально допустимое количество секунд.

С другой стороны, это требует от вас изменения каждой подпрограммы. Однако он выйдет из подпрограммы.

Вариант 2

Воспользуйтесь библиотекой резьбы - например, Pthreads. Когда вы хотите вызвать подпрограмму с таймаутом, создайте новый поток, который будет параллельно вашей основной программе, и выполните подпрограмму внутри этого потока выполнения. Затем в вашей основной программе спать в течение 10 секунд, а затем убить поток, который выполняет вашу подпрограмму.

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

Представьте, что время выполнения страницы приведено в следующем примере, а основные действия программы находятся слева, а действия подпрограммы - справа.

MAIN        SUBROUTINE YOUR_SUB 
... something .. 
... something ... 
f_pthread_create(,,,YOUR_SUB,)  start processing 
sleep(10)       ... calculate ... 
            ... calculate ... 
            ... calculate ... 
f_pthread_kill() 
... something .. 
... something ... 

Вариант 3

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

Какой бы вариант вы ни выбрали, вам придется подумать о том, как вы получаете результаты от подпрограммы, которую вы вызываете, - сохранит ли она их в файле? Нужна ли главная программа для доступа к ним? Являются ли они глобальными переменными? Причина в том, что если вы собираетесь следовать опциям 2 или 3, из подпрограммы не будет возвратного значения.

Оригинал ответа

Если у вас нет timeout, вы можете сделать

call system('./run & sleep 10; kill $!') 
+0

Я обновил ответ в свете дополнительной информации в вашем вопросе. –

0

Да, есть способ. посмотрите на команду Linux timeout

# run command for 10 seconds and then send it SIGTERM kill message 
# if not finished. 
call system('timeout 10 ./run') 

Пример

# finishes in 10 seconds with a return code of 0 to indicate success. 
sleep 10 

# finishes in 1 second with a return code of `124` to indicate timed out. 
timeout 1 sleep 10 

Вы также можете выбрать тип сигнала глушения, который вы хотите отправить, указав параметр -s. См. man timeout для получения дополнительной информации.

Смежные вопросы