<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: waitpid() для потомка который сделал setsid() </title>
    <link>https://m.opennet.me/openforum/vsluhforumID9/7831.html</link>
    <description>Привет.&lt;br&gt;&lt;br&gt;Заметил что waitpid() для _завершившегося_ потомка,&lt;br&gt;который стартовал через новую сессию (fork() -&amp;gt; setsid() -&amp;gt; execve())&lt;br&gt;всегда возвращает ECHILD (No child processes).&lt;br&gt;В то же время, сигнал SIGCHLD исправно доставляется родителю.&lt;br&gt;Т.е. получается, что &quot;оперившийся&quot; с помощью setsid() потомок&lt;br&gt;становится как бы почти взрослым :-) &lt;br&gt;и получить статус его завершения или убивший его сигнал&lt;br&gt;(причём нельзя узнать что именно) можно только через sighanler (siginfo_t).&lt;br&gt;Повторюсь, waitpid() запускается когда потомок уже завершился.&lt;br&gt;&lt;br&gt;Не могу найти где такое поведение явно прописано (если только я чего не напутал)&lt;br&gt;и желательно с ссылками на стандарт (POSIX, SVR, BSD).&lt;br&gt;&lt;br&gt;Linux/2.6&lt;br&gt;</description>

<item>
    <title>waitpid() для потомка который сделал setsid()  (Michelnok)</title>
    <link>https://m.opennet.me/openforum/vsluhforumID9/7831.html#3</link>
    <pubDate>Wed, 21 Jan 2009 12:10:18 GMT</pubDate>
    <description>&amp;gt;&amp;gt;wait получает pid потомка, даже если тот успешно сделал setsid.&lt;br&gt;&amp;gt;&amp;gt;$ uname -sr &lt;br&gt;&amp;gt;&amp;gt;Darwin 9.6.0&lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Уверены, что waitpid() запускали уже _после_ завершения потомка? &lt;br&gt;&lt;br&gt;Да.&lt;br&gt;&lt;br&gt;#include &amp;lt;signal.h&amp;gt;&lt;br&gt;#include &amp;lt;unistd.h&amp;gt;&lt;br&gt;#include &amp;lt;sys/wait.h&amp;gt;&lt;br&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br&gt;&lt;br&gt;int main(int argc, const char *argv&#091;&#093;) &#123;&lt;br&gt;sigset_t newmask, oldmask, waitmask;&lt;br&gt;pid_t pid_fork, pid_wait;&lt;br&gt;int stat;&lt;br&gt;&lt;br&gt;sigfillset(&amp;newmask);&lt;br&gt;if(sigprocmask(SIG_BLOCK, &amp;newmask, &amp;oldmask) &amp;lt; 0) &#123;&lt;br&gt;perror(&quot;sigprocmask&quot;);&lt;br&gt;return 0;&lt;br&gt;&#125;&lt;br&gt;pid_fork = fork();&lt;br&gt;if(pid_fork == -1) &#123;&lt;br&gt;perror(&quot;fork&quot;);&lt;br&gt;return 0;&lt;br&gt;&#125;&lt;br&gt;else if(pid_fork != 0) &#123;&lt;br&gt;sigemptyset(&amp;waitmask);&lt;br&gt;sigaddset(&amp;waitmask, SIGCHLD);&lt;br&gt;sigsuspend(&amp;waitmask);&lt;br&gt;pid_wait = waitpid(pid_fork, &amp;stat, 0);&lt;br&gt;printf(&quot;fork returned &#037;d, waitpid returned &#037;d&#092;n&quot;, pid_fork, pid_wait);&lt;br&gt;return 0;&lt;br&gt;&#125;&lt;br&gt;else &#123;&lt;br&gt;if(setsid() == -1) &#123;&lt;br&gt;perror(&quot;setsid&quot;);&lt;br&gt;return 0;&lt;br&gt;&#125;&lt;br&gt;return 0;&lt;br&gt;&#125;&lt;br&gt;&#125;&lt;br&gt;</description>
</item>

<item>
    <title>waitpid() для потомка который сделал setsid()  (devcoder)</title>
    <link>https://m.opennet.me/openforum/vsluhforumID9/7831.html#2</link>
    <pubDate>Wed, 21 Jan 2009 08:53:32 GMT</pubDate>
    <description>&amp;gt;wait получает pid потомка, даже если тот успешно сделал setsid.&lt;br&gt;&amp;gt;$ uname -sr &lt;br&gt;&amp;gt;Darwin 9.6.0&lt;br&gt;&lt;br&gt;Уверены, что waitpid() запускали уже _после_ завершения потомка?&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>waitpid() для потомка который сделал setsid()  (Michelnok)</title>
    <link>https://m.opennet.me/openforum/vsluhforumID9/7831.html#1</link>
    <pubDate>Wed, 21 Jan 2009 00:57:00 GMT</pubDate>
    <description>&amp;gt;Т.е. получается, что &quot;оперившийся&quot; с помощью setsid() потомок &lt;br&gt;&amp;gt;становится как бы почти взрослым :-) &lt;br&gt;&lt;br&gt;Проверил на минимальной реализации, не подтверждается.&lt;br&gt;wait получает pid потомка, даже если тот успешно сделал setsid.&lt;br&gt;Так что либо ошибка где-то, либо особенность Linux.&lt;br&gt;&lt;br&gt;$ uname -sr&lt;br&gt;Darwin 9.6.0&lt;br&gt;&lt;br&gt;</description>
</item>

</channel>
</rss>
