LINUX.ORG.RU

Как убить процесс по timeout'у?

 ,


2

2

Господа, нашёл sb-ext:run-program и кучу других нужных функций в секции 7.3.3 Running external programs. Но как убить процесс по timeout'у не нашёл. Интересует только sbcl, но если есть какие-нибудь переносимые библиотеки, то тоже очень хорошо.


sb-ext:process-kill

Таймаут делай сам, можно сделать блокирующий sleep, можно дожидаться этого в отдельном потоке, можно написать/найти более обобщенную библиотеку событий.

staseg ★★★★★
()

Не знаю sbcl является ли POSIX-совместимым языком, но везде делается через sigaction(2) и/или ualarm(3)

gh0stwizard ★★★★★
()
Ответ на: комментарий от antares0

Оу. Вроде то, что нужно. Спасибо. Только ссылка не работает — косяк с разметкой. trivial-timeout.

BooBoo
() автор топика

Нашёл макрос with-timeout в sbcl. Причём в последней версии документации SBCL 1.1.8 User Manual об этом макросе ни слова. Хотя он присутствует и в последнем sbcl (1.1.8). Также где-то читал что лучше не использовать with-timeout, проблемы какие-то есть. Господа лисперы, кто в теме, расскажите что к чему.

BooBoo
() автор топика
Ответ на: комментарий от BooBoo

Макрос гуглится и ссылается, видимо, на какую-то старую версию документации http://www.sbcl.org/manual/Mutex-Support.html.

Если у кого не под рукой, то вот этот код:

(with-timeout 5
  (sleep 10))
раскрывается в:
(FLET ((SB-IMPL::TIMEOUT-BODY ()
         (SLEEP 10)))
  (DECLARE (SB-INT:TRULY-DYNAMIC-EXTENT (FUNCTION SB-IMPL::TIMEOUT-BODY)))
  (LET ((SB-IMPL::EXPIRES 5))
    (IF (> SB-IMPL::EXPIRES 0)
        (LET ((TIMER (MAKE-TIMER #'SB-IMPL::TIMEOUT-CERROR)))
          (SCHEDULE-TIMER TIMER SB-IMPL::EXPIRES)
          (UNWIND-PROTECT (SB-IMPL::TIMEOUT-BODY) (UNSCHEDULE-TIMER TIMER)))
        (SB-IMPL::TIMEOUT-BODY))))

BooBoo
() автор топика
Ответ на: комментарий от BooBoo

Нашёл макрос with-timeout в sbcl. Причём в последней версии документации SBCL 1.1.8 User Manual об этом макросе ни слова.

Главный по SBCL, в 2011, хотел его выпилить в пользу более умной конструкции. Ноя не знаю чем дело кончилось.

Trivial-timeout это обертка к нему.

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

With-tiemout это некоректное завершение по принципу «рабочий день кончился и гори оно все огнем» то есть открытый файл может быть не закрыт, транзакция не откатится. Предполагается что внутри исключительных ситуауий не присходит и чисто потому что не мусорят.

Плюc момент что вложеные sb-ext:with-timeout друг о друге не догадываются, но это в trivial-timeout обошли.

antares0 ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.