The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"C++ / Проблемы с system()"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (C/C++)
Изначальное сообщение [ Отслеживать ]

"C++ / Проблемы с system()"  +/
Сообщение от src email(ok) on 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ообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "C++ / Проблемы с system()"  +/
Сообщение от mef (ok) on 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ообщить модератору

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

т.е.

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

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

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

#vi o

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

7. "не было б зависания"  +/
Сообщение от dimonna email(ok) on 14-Сен-10, 16:13 
я бы еще на

df -h

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру