2013-12-22 3 views
0

Как я могу закрыть программу linux в C. Я редактирую скрипт, чтобы иметь таймер, где скрипт работает только 10 секунд, а затем выключается.Завершить программу через X секунд Linux C

Линия Я бегу это: ./startmerge

Это код C, чтобы объединить все мои файлы сервера вместе, что я скачал, но я только хочу, чтобы работать в течение 10 секунд.

+0

Общим методом является использование таймера сторожевой собаки, работающего как другой процесс. Когда начнется ваш скрипт, сохраните созданный PID - тогда ваша собака следит за этим, посылая сигнал уничтожения, если это необходимо. –

+0

Что вы хотите, если он не закончил то, что он должен делать в течение 10 секунд? – Bandrami

+1

'alarm (10)' довольно просто, хотя, возможно, это не так, как вы действительно хотите. Обратите внимание, что вам нужно будет написать для него небольшой обработчик сигналов, потому что назначение по умолчанию заключается в завершении процесса. – Duck

ответ

3

Если большая часть времени тратится на вычисления с CPU (другими словами, если 10 секунд в ./startmerge не расходуются на IO), то вы хотите, чтобы ограничить процессорное время, поэтому используйте setrlimit(2) системный вызов с RLIMIT_CPU. В Баш, вы хотите использовать его ulimit встроенную команду (вызов setrlimit системного вызова), см this answer, как

ulimit -t 10 

перед запуском startmerge.

Если ваш startmerge не ресурсоемкие, вы хотите kill его через 10 секунд, возможно (см this)

startmerge & ; pidof_startmerge=$! 
    sleep 10; kill $pidof_startmerge 

еще лучше, сделать что цикл (например, петля в десять раз вокруг sleep 1)

Если у вас есть доступ к исходному коду C startmerge и вы хотите его исправить, прочитайте сначала time(7) и signal(7). Поскольку Duck прокомментировал, рассмотрите alarm(2) или setitimer(2) или timer_create(2) и настройте обработчик сигналов -e.g. для SIGALRM с sigaction(2) (но не забывайте, что обработчики сигналов ограничены только функциями async-signal-safe, вы можете установить в них переменную volatile sig_atomic_t и проверить эту переменную за пределами). Если у вашего startmerge есть event loop на основе некоторого мультиплексирования, например, poll(2) (или старого select(2)), он должен быть даже проще, а конкретный Linux timerfd_create(2) может быть очень полезен.

Вы можете поймать ловушку SIGALRM в bash, см. this.

Advanced Linux Programming имеет несколько глав, связанных с вашим вопросом. Advanced Bash Programming Guide также полезен для чтения.

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