Здравствуйте все!
Хочу поделиться своей проблемкой.Пишется демон для мультимедиа-проекта, выполняющий различные задачи (обработка видео и другие).
Один из потоков приложения регулярно опрашивает базу данных на наличие заданий и, находя задание, выполняет его.
Так получается, что время от времени (может, раз в день, может чаще) поток зависает на вызове функции system(). Например, конкретно (вырезать из фильма скриншот):
system("mplayer -ao null -ss 750 -vo jpeg:outdir=/root/daemon/.tmp -frames 1 /video/file1.avi");
Смотрю ps, висят 2 таких процесса:
1) sh -c mplayer -ao null -ss 750 -vo jpeg:outdir=/root/daemon/.tmp -frames 1 /video/file1.avi
2) mplayer -ao null -ss 750 -vo jpeg:outdir=/root/daemon/.tmp -frames 1 /video/file1.aviКогда вставляю в putty прямо в консоль данную команду, выполняется моментально, выдёргивает скриншот.
А через system() вот ведёт так себя непонятно.
Сталкивался ли кто-нибудь с подобным?Спасибо.
>1) sh -c mplayer -ao null -ss 750 -vo jpeg:outdir=/root/daemon/.tmp -frames 1
>/video/file1.avi
>2) mplayer -ao null -ss 750 -vo jpeg:outdir=/root/daemon/.tmp -frames 1 /video/file1.aviВозможно, нужно прописать полные пути для всего что выполняется в system.
Типа не mplayer, а /usr/local/sbin/./mplayer
Спасибо, попробую, потом отпишусь.И еще собственно вопрос - почему в процессах висят именно 2: первый - сама команда, второй: "sh -c <команда>"?
>И еще собственно вопрос - почему в процессах висят именно 2: первый - сама команда, второй: "sh -c <команда>"?Добавьте exec перед командой, чтобы этого не было.
>Спасибо, попробую, потом отпишусь.
>
>И еще собственно вопрос - почему в процессах висят именно 2: первый - сама команда, второй: "sh -c <команда>"?man system говорит что он создает дочерний процесс - командный интерпретатор (по умолчанию /bin/sh) и передает ему аргумент вызова функции в качестве параметра ключа -с. Родительский процесс переходит в состояние ожидания завершения дочернего процесса. Вот Вам и два процесса.
т.е.
system = fork() -> exec() -> wait()
Еще вариант... Сравните пути установленные в переменную окружения PATH когда заходите через putty и когда запущена программа. Скорее всего они разные и для программы mplayera в них нет.В любом случае errno Вам скажет чего там system-у не понравилось. Достаточно лишь проверить :)
>Еще вариант... Сравните пути установленные в переменную окружения PATH когда заходите через
>putty и когда запущена программа. Скорее всего они разные и для
>программы mplayera в них нет.
>
>В любом случае errno Вам скажет чего там system-у не понравилось. Достаточно
>лишь проверить :)В случае, если не найден исполняемый файл, вызов вернулся б мгновенно. Тут, скорее всего, другое, mplayer пишет в оутпут, а демонизация была "трушной", с закрытием ввода/вывода/ошибок - 0,1,2 дескрипторов. Потом открыли, допустим, трубу, один из дескрипторов получил первый номер, клозе он екзес не выставлен, мплейер сколько-то пишет в неё, потом тупо виснет на write.
Предлагаю диагностику ситуации:
#strace -ffo.log этот_демон
#vi o
/mplayer/
ну и смотреть, на чём висим, во что пишем/читаем, кто открыл эти дескрипторы, откуда взялись, унаследованы от родителя, либо что другое.
я бы еще наdf -h
...посмотрел бы на всякий случай :)