2015-05-09 2 views
1

Я написал демона TCP, который принимает подключения клиентов к данному порту и после этого выполняет команду с использованием execv (3). В каждом учебном пособии по написанию демонов упоминается, что он закрывает stdin, stdout, stderr, чтобы успешно демонировать процесс.daemon: closed stderr и accept (2)

Однако я обнаружил, что accept (2) повторно использует номера дескрипторов файла уже закрытых stdout/stderr, поэтому после вызова fork (2) и execv (3) дочерний процесс записывает вывод в сокет просто потому, что stdout/stderr сопоставляется файлу дескриптор теперь связан с клиентским сокетом.

Любые идеи, как я могу избежать этого, не прибегая к перенаправлению вывода оболочки?

ответ

1

Все!

Если вы не хотите, чтобы дескрипторы файлов для стандартного ввода/вывода были повторно использованы с помощью accept (2) и, предположительно, любой другой функции, которая возвращает новый файловый дескриптор, избегайте вызова close (2)/fclose (3) на них , но перенаправляйте их в/dev/null (если доступно). Эта идея взята из справочной страницы для демона (3).

freopen ("/dev/null", "r", stdin); 
freopen ("/dev/null", "w", stdout); 
freopen ("/dev/null", "w", stderr); 
0

Прежде всего, к процессу демона, его родитель должен быть удален, поэтому он будет перенаправлен на процесс INIT и станет демоном.

Я думаю, что ваш прецедент, вы получаете команду от других клиентов и выполняете его в своем демоне, а затем перенаправляете вывод запрашивающему клиенту. Если вы планируете использовать концепцию STD_ERR и STD_OUT, тогда вы должны быть осторожным, чтобы получать запрос только последовательным образом.

Теперь приходят на ваш вопрос, Перенаправление STD_ERR и STD_OUT с принятым клиентом FD, вы должны держать STD_ERR и STD_OUT открыты до клиента принимаются, после принятия только клиента, закройте STD_OUT, а затем использовать DUP с общепринятым клиент FD.

см. Ссылку ниже, чтобы получить больше информации об этом виде проблемы. practical examples use dup or dup2