<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: C++ / Проблемы с system()</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/8841.html</link>
    <description>Здравствуйте все!&lt;br&gt;Хочу поделиться своей проблемкой.&lt;br&gt;&lt;br&gt;Пишется демон для мультимедиа-проекта, выполняющий различные задачи (обработка видео и другие).&lt;br&gt;&lt;br&gt;Один из потоков приложения регулярно опрашивает базу данных на наличие заданий и, находя задание, выполняет его.&lt;br&gt;&lt;br&gt;Так получается, что время от времени (может, раз в день, может чаще) поток зависает на вызове функции system(). Например, конкретно (вырезать из фильма скриншот):&lt;br&gt;&lt;br&gt;system(&quot;mplayer -ao null -ss 750 -vo jpeg:outdir=/root/daemon/.tmp -frames 1 /video/file1.avi&quot;);&lt;br&gt;&lt;br&gt;Смотрю ps, висят 2 таких процесса:&lt;br&gt;&lt;br&gt;1) sh -c mplayer -ao null -ss 750 -vo jpeg:outdir=/root/daemon/.tmp -frames 1 /video/file1.avi&lt;br&gt;2) mplayer -ao null -ss 750 -vo jpeg:outdir=/root/daemon/.tmp -frames 1 /video/file1.avi&lt;br&gt;&lt;br&gt;Когда вставляю в putty прямо в консоль данную команду, выполняется моментально, выдёргивает скриншот.&lt;br&gt;&lt;br&gt;А через system() вот ведёт так себя непонятно.&lt;br&gt;Сталкивался ли кто-нибудь с подобным?&lt;br&gt;&lt;br&gt;Спасибо.&lt;br&gt;</description>

<item>
    <title>не было б зависания (dimonna)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/8841.html#7</link>
    <pubDate>Tue, 14 Sep 2010 12:13:46 GMT</pubDate>
    <description>я бы еще на&lt;br&gt;&lt;br&gt;df -h&lt;br&gt;&lt;br&gt;...посмотрел бы на всякий случай :)&lt;br&gt;</description>
</item>

<item>
    <title>не было б зависания (Вова)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/8841.html#6</link>
    <pubDate>Tue, 14 Sep 2010 05:55:49 GMT</pubDate>
    <description>&amp;gt;Еще вариант... Сравните пути установленные в переменную окружения PATH когда заходите через &lt;br&gt;&amp;gt;putty и когда запущена программа. Скорее всего они разные и для &lt;br&gt;&amp;gt;программы mplayera в них нет. &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;В любом случае errno Вам скажет чего там system-у не понравилось. Достаточно &lt;br&gt;&amp;gt;лишь проверить :) &lt;br&gt;&lt;br&gt;В случае, если не найден исполняемый файл, вызов вернулся б  мгновенно. Тут, скорее всего, другое, mplayer пишет в оутпут, а демонизация была &quot;трушной&quot;, с закрытием ввода/вывода/ошибок - 0,1,2 дескрипторов. Потом открыли, допустим, трубу, один из дескрипторов получил первый номер, клозе он екзес не выставлен,  мплейер сколько-то пишет в неё, потом тупо виснет на write. &lt;br&gt;&lt;br&gt; Предлагаю диагностику ситуации:&lt;br&gt;&lt;br&gt;#strace -ffo.log этот_демон&lt;br&gt;&lt;br&gt;#vi o &lt;br&gt;&lt;br&gt;/mplayer/&lt;br&gt;ну и смотреть, на чём висим, во что пишем/читаем, кто открыл эти дескрипторы, откуда взялись, унаследованы от родителя, либо что другое.&lt;br&gt;</description>
</item>

<item>
    <title>C++ / Проблемы с system() (dimonna)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/8841.html#5</link>
    <pubDate>Mon, 13 Sep 2010 14:11:01 GMT</pubDate>
    <description>&amp;gt;Спасибо, попробую, потом отпишусь. &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;И еще собственно вопрос - почему в процессах висят именно 2: первый - сама команда, второй: &quot;sh -c &amp;lt;команда&amp;gt;&quot;?&lt;br&gt;&lt;br&gt;man system говорит что он создает дочерний процесс - командный интерпретатор (по умолчанию /bin/sh) и передает ему аргумент вызова функции в качестве параметра ключа -с. Родительский процесс переходит в состояние ожидания завершения дочернего процесса. Вот Вам и два процесса.&lt;br&gt;&lt;br&gt;т.е.&lt;br&gt;&lt;br&gt;system = fork() -&amp;gt; exec() -&amp;gt; wait()&lt;br&gt;</description>
</item>

<item>
    <title>C++ / Проблемы с system() (dimonna)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/8841.html#4</link>
    <pubDate>Mon, 13 Sep 2010 14:07:10 GMT</pubDate>
    <description>Еще вариант... Сравните пути установленные в переменную окружения PATH когда заходите через putty и когда запущена программа. Скорее всего они разные и для программы mplayera в них нет.&lt;br&gt;&lt;br&gt;В любом случае errno Вам скажет чего там system-у не понравилось. Достаточно лишь проверить :)&lt;br&gt;</description>
</item>

<item>
    <title>C++ / Проблемы с system() (phpcoder)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/8841.html#3</link>
    <pubDate>Sun, 05 Sep 2010 10:54:19 GMT</pubDate>
    <description>&amp;gt;И еще собственно вопрос - почему в процессах висят именно 2: первый - сама команда, второй: &quot;sh -c &amp;lt;команда&amp;gt;&quot;?&lt;br&gt;&lt;br&gt;Добавьте exec перед командой, чтобы этого не было.&lt;br&gt;</description>
</item>

<item>
    <title>C++ / Проблемы с system() (src)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/8841.html#2</link>
    <pubDate>Sat, 04 Sep 2010 20:46:01 GMT</pubDate>
    <description>Спасибо, попробую, потом отпишусь.&lt;br&gt;&lt;br&gt;И еще собственно вопрос - почему в процессах висят именно 2: первый - сама команда, второй: &quot;sh -c &amp;lt;команда&amp;gt;&quot;?&lt;br&gt;</description>
</item>

<item>
    <title>C++ / Проблемы с system() (mef)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/8841.html#1</link>
    <pubDate>Sat, 04 Sep 2010 18:44:01 GMT</pubDate>
    <description>&amp;gt;1) sh -c mplayer -ao null -ss 750 -vo jpeg:outdir=/root/daemon/.tmp -frames 1 &lt;br&gt;&amp;gt;/video/file1.avi &lt;br&gt;&amp;gt;2) mplayer -ao null -ss 750 -vo jpeg:outdir=/root/daemon/.tmp -frames 1 /video/file1.avi &lt;br&gt;&lt;br&gt;Возможно, нужно прописать полные пути для всего что выполняется в system. &lt;br&gt;Типа не mplayer, а /usr/local/sbin/./mplayer &lt;br&gt;</description>
</item>

</channel>
</rss>
