<div class="gmail_quote">4 мая 2010 г. 18:39 пользователь Michael Pozhidaev <span dir="ltr">&lt;<a href="mailto:msp@altlinux.ru">msp@altlinux.ru</a>&gt;</span> написал:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
Hello, Anton Protopopov!<br>
<div class="im"><br>
&gt;     Тем не менее, по факту /bin/sh -c в альте даже и не думает порождать<br>
&gt;     новую группу процессов, ни когда запускаются несколько команд через<br>
&gt;     трубу, ни одна команда.<br>
&gt;<br>
&gt; Интересно, а зачем это понадобилось?<br>
<br>
</div>Антон, спасибо за подробное разъяснение. Тут решается одна проблема,<br>
суть которой сейчас попробую изложить. Речь идёт о разработке<br>
приложения, код которого Вы можете увидеть в git:<br>
<br>
<a href="http://git.altlinux.org/people/msp/public/voiceman.git" target="_blank">http://git.altlinux.org/people/msp/public/voiceman.git</a><br>
<br>
Код, который делает обсуждаемые действия, лежит в файле<br>
voiceman/executors/default.c.<br>
<br>
Теперь задача:<br>
<br>
нам необходимо запускать и останавливать последовательность пар команд,<br>
каждая из которых ззадаётся аргументом для /bin/sh -c. Если говорить<br>
точнее, то речь идёт о запуске речевого синтезатора и плеера. Они<br>
связаны между собой трубой. Вывод речевого синтезатора направляется на<br>
вход плеера. В общем случае синтезатор и плеер могут работать не в одном<br>
процессе, а порождать дочерние и т. д. Необходимо уметь по команде<br>
прибить всю эту пачку процессов, включая все процессы синтезатора и<br>
плеера. Для этого перед вызовом /bin/sh -c для синтезатора вызывается<br>
setpgrp(), а перед вызовом этого же для плеера вызывается setpgid() для<br>
включения процесса плеера в ту же группу, которая породилась для работы<br>
синтезаторов.<br>
<br>
Итак, сейчас код не работает. Точнее, он ведёт себя превосходно на<br>
альте, но на проблемы жалуются пользователи Ubuntu.<br></blockquote><div></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<br>
Проблема выглядит так, что процесс плеера, который в большинстве случаев<br>
aplay. вовремя не получает SIGKILL. Есть задержка, которая вполне может<br>
быть просто проигрыванием данных, которые забуферизировались в трубе<br>
после смерти синтезатора.<br></blockquote><div><br>Но сигнал все-таки доходит?<br> <br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

Проблему объясняло бы предположение, что когда вызывается /bin/sh -c он<br>
создаёт свою группу, теряет связь с группой синтезатора и aplay уже не<br>
получает сигнала, разосланного через killpg.<br></blockquote><div><br>Ну, например, еще есть race: setpgid() в плейере может запускаться раньше,<br>чем setpgrp() в синтезаторе. В этом случае он, очевидно, не сможет установить<br>
лидером синтезатор, а вернет ошибку.<br><br>В любом случае, ps вам расскажет точно у кого какая группа и кто является<br>лидером группы.<br> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

В общих чертах такая картина. Проблема до сих пор не решена. Решать её<br>
тяжело, т.к. на моей машине-то всё работает безупречно. Ещё есть<br>
некоторые дополнительные детали и ньюансы, заставляющие думать, что тут<br>
дело всё-таки в работе над процессами.<br>
<div><div></div><div class="h5"><br>
--<br>
Michael Pozhidaev. Tomsk, Russia. E-mail: <a href="mailto:msp@altlinux.ru">msp@altlinux.ru</a><br>
Russian info page: <a href="http://www.marigostra.ru/" target="_blank">http://www.marigostra.ru/</a><br>
<br>
_______________________________________________<br>
Sisyphus mailing list<br>
<a href="mailto:Sisyphus@lists.altlinux.org">Sisyphus@lists.altlinux.org</a><br>
<a href="https://lists.altlinux.org/mailman/listinfo/sisyphus" target="_blank">https://lists.altlinux.org/mailman/listinfo/sisyphus</a></div></div></blockquote></div><br>