[sisyphus] Q: shell and process groups
Anton Protopopov
aspsk на altlinux.org
Вт Май 4 15:43:55 UTC 2010
4 мая 2010 г. 18:39 пользователь Michael Pozhidaev <msp на altlinux.ru>написал:
> Hello, Anton Protopopov!
>
> > Тем не менее, по факту /bin/sh -c в альте даже и не думает порождать
> > новую группу процессов, ни когда запускаются несколько команд через
> > трубу, ни одна команда.
> >
> > Интересно, а зачем это понадобилось?
>
> Антон, спасибо за подробное разъяснение. Тут решается одна проблема,
> суть которой сейчас попробую изложить. Речь идёт о разработке
> приложения, код которого Вы можете увидеть в git:
>
> http://git.altlinux.org/people/msp/public/voiceman.git
>
> Код, который делает обсуждаемые действия, лежит в файле
> voiceman/executors/default.c.
>
> Теперь задача:
>
> нам необходимо запускать и останавливать последовательность пар команд,
> каждая из которых ззадаётся аргументом для /bin/sh -c. Если говорить
> точнее, то речь идёт о запуске речевого синтезатора и плеера. Они
> связаны между собой трубой. Вывод речевого синтезатора направляется на
> вход плеера. В общем случае синтезатор и плеер могут работать не в одном
> процессе, а порождать дочерние и т. д. Необходимо уметь по команде
> прибить всю эту пачку процессов, включая все процессы синтезатора и
> плеера. Для этого перед вызовом /bin/sh -c для синтезатора вызывается
> setpgrp(), а перед вызовом этого же для плеера вызывается setpgid() для
> включения процесса плеера в ту же группу, которая породилась для работы
> синтезаторов.
>
> Итак, сейчас код не работает. Точнее, он ведёт себя превосходно на
> альте, но на проблемы жалуются пользователи Ubuntu.
>
> Проблема выглядит так, что процесс плеера, который в большинстве случаев
> aplay. вовремя не получает SIGKILL. Есть задержка, которая вполне может
> быть просто проигрыванием данных, которые забуферизировались в трубе
> после смерти синтезатора.
>
Но сигнал все-таки доходит?
> Проблему объясняло бы предположение, что когда вызывается /bin/sh -c он
> создаёт свою группу, теряет связь с группой синтезатора и aplay уже не
> получает сигнала, разосланного через killpg.
>
Ну, например, еще есть race: setpgid() в плейере может запускаться раньше,
чем setpgrp() в синтезаторе. В этом случае он, очевидно, не сможет
установить
лидером синтезатор, а вернет ошибку.
В любом случае, ps вам расскажет точно у кого какая группа и кто является
лидером группы.
> В общих чертах такая картина. Проблема до сих пор не решена. Решать её
> тяжело, т.к. на моей машине-то всё работает безупречно. Ещё есть
> некоторые дополнительные детали и ньюансы, заставляющие думать, что тут
> дело всё-таки в работе над процессами.
>
> --
> Michael Pozhidaev. Tomsk, Russia. E-mail: msp на altlinux.ru
> Russian info page: http://www.marigostra.ru/
>
> _______________________________________________
> Sisyphus mailing list
> Sisyphus на lists.altlinux.org
> https://lists.altlinux.org/mailman/listinfo/sisyphus
>
----------- следующая часть -----------
Вложение в формате HTML было удалено...
URL: <http://lists.altlinux.org/pipermail/sisyphus/attachments/20100504/e29b2af2/attachment.html>
Подробная информация о списке рассылки Sisyphus