<div class="gmail_quote">5 мая 2010 г. 0:43 пользователь Michael Pozhidaev <span dir="ltr">&lt;<a href="mailto:msp@altlinux.ru">msp@altlinux.ru</a>&gt;</span> написал:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hello, Anton Protopopov!<br>
<div class="im"><br>
&gt;     после смерти синтезатора.<br>
&gt;<br>
&gt; Но сигнал все-таки доходит?<br>
<br>
</div>Скорее всего нет. Исследование в strace планировали провести<br>
завтра. Есть такое наблюдение: поскольку процесс не сразу после своего<br>
порождения меняет свою группу, то SIGKILL шлётся в два этапа: сначала<br>
персонально этому процессу на случай, если он ещё не сменил свой pgid, а<br>
потом на всю группу. Если плеер указывается как exec aplay, а не просто<br>
aplay, то проблема сразу же исчезает. То есть персональный SIGKILL<br>
всегда попадает в цель, а вот SIGKILL на группу иногда даёт промахи.<br>
В случае без exec SIGKILL прибивает /bin/sh, а aplay продолжает работать.<br>
<div class="im"><br>
&gt; Ну, например, еще есть race: setpgid() в плейере может запускаться раньше,<br>
&gt; чем setpgrp() в синтезаторе. В этом случае он, очевидно, не сможет установить<br>
&gt; лидером синтезатор, а вернет ошибку.<br>
<br>
</div>О, действительно! Только, скорее, наоборот. В мане по setpgid говорится,<br>
что pgid должен быть existing process group. Existing, как понимаю,<br>
имеется ввиду, что существует корень группы.<br>
В этом race setpgid() провалится, а setpgrp() сам себе отработатм, но<br>
плеер в группу не попадёт.</blockquote><div><br>Именно так я и написал :)<br><br>Вызов setpgrp() делает вызывающий процесс (pid1) лидером новой группы, состоящей<br>из одного процеса pid1. Если процесс pid2 параллельно с этим делает setpgid(0, pid1),<br>
то он пытается добавить себя к группе процессов с лидером pid1. Если процесс pid2<br>запускает setpgid раньше, чем процесс pid1 запускает setpgrp, то он пытается добавить<br>себя к несуществующей группе процессов, а это запрещено. Такое вполне может<br>
случиться даже на одноядерной машине, так как никто не знает в какой последовательности<br>будут запущены процессы после fork().<br> <br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Спасибо, приделаю фикс и о результатах<br>
доложу.<br>
<br>
В качестве фикса, наверно, выделю плеер в свою собственную группу, к<br>
которой и будем обращаться. Ещё раз спасибо!<br>
<font color="#888888"><br>
--<br>
</font><div><div></div><div class="h5">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>