URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8841
[ Назад ]

Исходное сообщение
"C++ / Проблемы с system()"

Отправлено src , 04-Сен-10 19:23 
Здравствуйте все!
Хочу поделиться своей проблемкой.

Пишется демон для мультимедиа-проекта, выполняющий различные задачи (обработка видео и другие).

Один из потоков приложения регулярно опрашивает базу данных на наличие заданий и, находя задание, выполняет его.

Так получается, что время от времени (может, раз в день, может чаще) поток зависает на вызове функции 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() вот ведёт так себя непонятно.
Сталкивался ли кто-нибудь с подобным?

Спасибо.


Содержание

Сообщения в этом обсуждении
"C++ / Проблемы с system()"
Отправлено mef , 04-Сен-10 22:44 
>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


"C++ / Проблемы с system()"
Отправлено src , 05-Сен-10 00:46 
Спасибо, попробую, потом отпишусь.

И еще собственно вопрос - почему в процессах висят именно 2: первый - сама команда, второй: "sh -c <команда>"?


"C++ / Проблемы с system()"
Отправлено phpcoder , 05-Сен-10 14:54 
>И еще собственно вопрос - почему в процессах висят именно 2: первый - сама команда, второй: "sh -c <команда>"?

Добавьте exec перед командой, чтобы этого не было.


"C++ / Проблемы с system()"
Отправлено dimonna , 13-Сен-10 18:11 
>Спасибо, попробую, потом отпишусь.
>
>И еще собственно вопрос - почему в процессах висят именно 2: первый - сама команда, второй: "sh -c <команда>"?

man system говорит что он создает дочерний процесс - командный интерпретатор (по умолчанию /bin/sh) и передает ему аргумент вызова функции в качестве параметра ключа -с. Родительский процесс переходит в состояние ожидания завершения дочернего процесса. Вот Вам и два процесса.

т.е.

system = fork() -> exec() -> wait()


"C++ / Проблемы с system()"
Отправлено dimonna , 13-Сен-10 18:07 
Еще вариант... Сравните пути установленные в переменную окружения PATH когда заходите через putty и когда запущена программа. Скорее всего они разные и для программы mplayera в них нет.

В любом случае errno Вам скажет чего там system-у не понравилось. Достаточно лишь проверить :)


"не было б зависания"
Отправлено Вова , 14-Сен-10 09:55 
>Еще вариант... Сравните пути установленные в переменную окружения PATH когда заходите через
>putty и когда запущена программа. Скорее всего они разные и для
>программы mplayera в них нет.
>
>В любом случае errno Вам скажет чего там system-у не понравилось. Достаточно
>лишь проверить :)

В случае, если не найден исполняемый файл, вызов вернулся б  мгновенно. Тут, скорее всего, другое, mplayer пишет в оутпут, а демонизация была "трушной", с закрытием ввода/вывода/ошибок - 0,1,2 дескрипторов. Потом открыли, допустим, трубу, один из дескрипторов получил первый номер, клозе он екзес не выставлен,  мплейер сколько-то пишет в неё, потом тупо виснет на write.

Предлагаю диагностику ситуации:

#strace -ffo.log этот_демон

#vi o

/mplayer/
ну и смотреть, на чём висим, во что пишем/читаем, кто открыл эти дескрипторы, откуда взялись, унаследованы от родителя, либо что другое.


"не было б зависания"
Отправлено dimonna , 14-Сен-10 16:13 
я бы еще на

df -h

...посмотрел бы на всякий случай :)