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 $!')
Какой язык вы звоните? –
И на какой платформе вы работаете? –
@MarkSetchell обновленный вопрос – user2945166