Кто нибудь знает, как можно по тайм-ауту завершить процесс, порожденный функцией popen? Функция alarm прекращает работу главного процесса и всех потомков, а надо убиватьтолько дочерние процессы.
Возможно кто-то знает как узнать pid процесса порожденого функцией popen.P.S. Желательно найти решение без использования fork
вызвать pclose>P.S. Желательно найти решение без использования fork
а ведь это и есть fork c pipe
pclose вызывается в любом случае. Проблема в том, что команда запущенная через popen может зависнуть или выполняться слишком долго. Поэтому нужно убивать этот процесс по тайм-ауту.
А насчет fork, я имел в виду, что можно вызвать fork, а затем в дочернем процессе вызвать popen. При таком подходе можно выставить тайм-аут в дочернем процессе используя функцию alarm. Но в этом случае fork фактически вывзывается два раза. Один раз прямо в программе, другой в popen. Хотелось бы ограничиться только одним fork.
Синхронизируй процессы через полученный канал.
Если через тайм-аут дочерний не пришлет какое-нибудь подтверждение, убиваешь его.
Проблема в том, что я открываю канал на запись а не на чтение. К тому же если даже канал был двухсторонний (на чтение и запись), то я не знаю что мне вернет дочерний процесс, так как в дочернем процессе могут запускаться любые комманды (фактически он может вообще ничего не возращать)
Что-то больше ничего пока в голову не приходит.
А может тебе пользоваться отдельно fork, pipe, invoke?
Спасибо за совет. Я скачал исходник popen и pclose. Попробую на их основе сделать функции, в которых можно выставить тайм-аут на время выполнения комманды.
>Спасибо за совет. Я скачал исходник popen и pclose. Попробую на их
>основе сделать функции, в которых можно выставить тайм-аут на время выполнения
>комманды.
Ну и как? Удачно??? Сообщи, плиз!