<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: Треды + fork</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8176.html</link>
    <description>Есть достаточно сложное многопотоковое приложение. Оно должно иногда запускать дочерние процессы и контролировать их выполнение. Возникает такая ситуация: по TCP этому приложению отправляется запрос, на который оно успешно fork&apos;ает ребенка, отвечает &#096;ok&apos; и закрывает сокет. Проблема в том, что сокет не закрывается, по всей видимости из-за того, что при fork дескриптор сокета наследуется. Вопрос: как корректно закрыть все родительские дескрипторы в ребенке?&lt;br&gt;&lt;br&gt;1. Вести учет открытых файловых дескрипторов по всему приложению я, разумеется, не собираюсь, по этой же причине никаких FD_CLOEXEC.&lt;br&gt;2. Нужно кроссплатформенное решение. Есть unshare, но это только Linux; есть rfork, но это только FreeBSD.&lt;br&gt;</description>

<item>
    <title>Треды + fork (Аноним)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8176.html#10</link>
    <pubDate>Sun, 29 Mar 2009 13:35:55 GMT</pubDate>
    <description>&amp;gt;Закрой в себе сначала всё плохое и ненужное, а потом делай детей. &lt;br&gt;&lt;br&gt;Универсальный ответ. Напиши его во все темы на этом форуме и застрелись, идиот :))&lt;br&gt;</description>
</item>

<item>
    <title>Треды + fork (svn)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8176.html#9</link>
    <pubDate>Fri, 27 Mar 2009 20:08:00 GMT</pubDate>
    <description>&amp;gt;shutdown не то. Нужно _закрыть_ в ребенке все, кроме 0,1,2.&lt;br&gt;&lt;br&gt;Закрой в себе сначала всё плохое и ненужное, а потом делай детей.&lt;br&gt;</description>
</item>

<item>
    <title>Треды + fork (Petr)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8176.html#8</link>
    <pubDate>Fri, 27 Mar 2009 14:39:47 GMT</pubDate>
    <description>&amp;gt;Не следить за дескрипторами это и есть &apos;угрёбищное&apos; решение. &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Использовать для всех управляемых дескрипторов флаг FD_CLOEXEC, это нормальное корректное решение. Ни &lt;br&gt;&amp;gt;разу не костыль.&lt;br&gt;&lt;br&gt;Это именно костыль, потому закрывать или не закрывать дескрипторы при exec - это исключительно дело кода, вызывающего exec, а не кода, работающего с этими дескрипторами. Простой пример - после форка я могу exec&apos;нуть как кусок себя, который ожидает открытый 3, так и стороннюю программу, где должно быть закрыто все. И что, cloexec или не cloexec?&lt;br&gt;&lt;br&gt;Про чужой код я уже упомянул - ваши &#096;следует предпринять попытки&apos; из области фантастики.&lt;br&gt; Вы предлагаете лезть во _все_ компоненты, и втыкать туда fcntl, тогда как решение - закрывать или не закрывать, принимается все равно перед fork&apos;ом или exec&apos;ом.&lt;br&gt;&lt;br&gt;&amp;gt;// в случае отсутствия getdtablesize() можно использовать макрос MAX_FD &lt;br&gt;&amp;gt;for (int i_fd = getdtablesize()-1;  i_fd &amp;gt; 2; --i_fd) close(i_fd); // оставили 0,1,2&lt;br&gt;&lt;br&gt;Да, мне это по началу казалось костылем, но, видимо, так оно и д</description>
</item>

<item>
    <title>Треды + fork (vic)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8176.html#7</link>
    <pubDate>Fri, 27 Mar 2009 13:29:56 GMT</pubDate>
    <description>&amp;gt;&amp;gt;Не зря :) автор же написал:&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;1. Вести учет открытых файловых дескрипторов по всему приложению я, разумеется, не&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;собираюсь, по этой же причине никаких FD_CLOEXEC. &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Вы что же, не согласны, что это угрёбищное решение? Хотя бы потому, &lt;br&gt;&amp;gt;что в проекте используются закрытые библитеки, которые файлы открывают, а вот &lt;br&gt;&amp;gt;впихнуть в них fcntl - звиняйте. Поэтому я просил решение, а &lt;br&gt;&amp;gt;не костыль. &lt;br&gt;&lt;br&gt;Не следить за дескрипторами это и есть &apos;угрёбищное&apos; решение.&lt;br&gt;&lt;br&gt;Использовать для всех управляемых дескрипторов флаг FD_CLOEXEC, это нормальное корректное решение. Ни разу не костыль.&lt;br&gt;&lt;br&gt;Для неуправляемых по какой-либо причине дескрипторов следует предпринять попытки сделать их управляемые и далее см. выше. Иначе возможно использование следующего приема:&lt;br&gt;&lt;br&gt;// в случае отсутствия getdtablesize() можно использовать макрос MAX_FD&lt;br&gt;for (int i_fd = getdtablesize()-1;  i_fd &amp;gt; 2; --i_fd) close(i_fd); // оставили 0,1,2&lt;br&gt;&lt;br&gt;А также есть интересный для изучения каталог /proc/self/fd, но он может быть не везде.&lt;br&gt;&lt;br&gt;Прием </description>
</item>

<item>
    <title>Треды + fork (const86)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8176.html#6</link>
    <pubDate>Fri, 27 Mar 2009 13:09:55 GMT</pubDate>
    <description>&amp;gt; Нужно _закрыть_ в ребенке все, кроме 0,1,2.&lt;br&gt;&lt;br&gt;Можно посмотреть свой RLIMIT_NOFILE и пробежаться в цикле, всё поcloseить.&lt;br&gt;Смутно припоминается, что это как-то вроде можно побыстрее сделать, но не могу вспомнить.&lt;br&gt;</description>
</item>

<item>
    <title>Треды + fork (Petr)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8176.html#5</link>
    <pubDate>Fri, 27 Mar 2009 12:51:35 GMT</pubDate>
    <description>&amp;gt;Не зря :) автор же написал:&lt;br&gt;&amp;gt;&amp;gt;1. Вести учет открытых файловых дескрипторов по всему приложению я, разумеется, не&lt;br&gt;&amp;gt;&amp;gt;собираюсь, по этой же причине никаких FD_CLOEXEC. &lt;br&gt;&lt;br&gt;Вы что же, не согласны, что это угрёбищное решение? Хотя бы потому, что в проекте используются закрытые библитеки, которые файлы открывают, а вот впихнуть в них fcntl - звиняйте. Поэтому я просил решение, а не костыль.&lt;br&gt;</description>
</item>

<item>
    <title>Треды + fork (Petr)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8176.html#4</link>
    <pubDate>Fri, 27 Mar 2009 12:43:46 GMT</pubDate>
    <description>&amp;gt;1. Есть shutdown()&lt;br&gt;&amp;gt;2. п. 1 не спасёт от небходимости закрывать дескриптор в parent --- &lt;br&gt;&amp;gt;иначе потекут дескрипторы, а это ограниченный ресурс.&lt;br&gt;&lt;br&gt;shutdown не то. Нужно _закрыть_ в ребенке все, кроме 0,1,2. TCP соединение обрабатывается  в родителе, в котором все, что нужно, закрывается.&lt;br&gt;&lt;br&gt;&amp;gt;3. Аффтору убить себя ап стену. &lt;br&gt;&lt;br&gt;Детский сад...&lt;br&gt;</description>
</item>

<item>
    <title>Треды + fork (vic)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8176.html#3</link>
    <pubDate>Fri, 27 Mar 2009 10:33:15 GMT</pubDate>
    <description>&amp;gt;&amp;gt;3. Аффтору убить себя ап стену. &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Зря вы так. С клиентским сокетом действительно всё просто: форкнулись, в родительском &lt;br&gt;&amp;gt;процессе закрыли, в дочернем общаемся с клиентом. Но есть интересный момент &lt;br&gt;&amp;gt;с другими файлами, которые могли наоткрываться в родительском процессе, особенно в &lt;br&gt;&amp;gt;других потоках. Они останутся в дочернем. Вроде как не особо и &lt;br&gt;&amp;gt;мешает это, но всё же лучше бы их тоже закрывать. &lt;br&gt;&lt;br&gt;Не зря :) автор же написал:&lt;br&gt;&amp;gt;1. Вести учет открытых файловых дескрипторов по всему приложению я, разумеется, не&lt;br&gt;&amp;gt;собираюсь, по этой же причине никаких FD_CLOEXEC. </description>
</item>

<item>
    <title>Треды + fork (const86)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8176.html#2</link>
    <pubDate>Fri, 27 Mar 2009 08:19:12 GMT</pubDate>
    <description>&amp;gt;3. Аффтору убить себя ап стену. &lt;br&gt;&lt;br&gt;Зря вы так. С клиентским сокетом действительно всё просто: форкнулись, в родительском процессе закрыли, в дочернем общаемся с клиентом. Но есть интересный момент с другими файлами, которые могли наоткрываться в родительском процессе, особенно в других потоках. Они останутся в дочернем. Вроде как не особо и мешает это, но всё же лучше бы их тоже закрывать.&lt;br&gt;</description>
</item>

</channel>
</rss>
