LINUX.ORG.RU

Странное поведение демона


0

0

На днях столкнулся с такой вот проблемой.

Стоит: Red Hat Linux release 9 (Shrike) + Apache 2.0.40. Есть скрипт на PHP, который с помощью exec() запускает сишную прогу myprogram. myprogram делает fork() и работает как демон. Открывает при работе только одно исходящее соединение, порты не слушает.

Запускаю через браузер свой PHP-скрипт. Он запускает сишную программу. Все ok, все пашет.

Затем мне понадобилось перезапустить Web-сервер. Делаю: service httpd stop. Но после того, как я обратно сделал service httpd start, получил ошибку:

make_sock: could not bind to address 0.0.0.0:443
no listening sockets available, shutting down

Хм, 5 минут назад все ж отлично работало. Делаю netstat -nlp и вижу такую картину:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
...
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 14656/myprogram
...

Т.е. myprogram с правами apache умудрилась занять 443-й порт, который занимал Web-сервер! Причем, если запустить две копии myprogram, она займет порты 80 и 443. После kill'а для myprogram все заработало.

Как можно побороть это явление? И как оно вообще объясняется с научной точки зрения? Спасибо.

anonymous

Явление объясняется очень просто: все сокеты и множество других вещей наследуются потомком.

Если тебе ничего наследовать не нужно, то либо закрывай всё в потомке после fork, либо выставляй флаги автозакрытия (fcntl + FD_CLOEXEC).

execve
()
Ответ на: комментарий от execve

Эээ, а можно чуточку подробнее, как это сделать? Я-то посмотрел в сторону close() и fcntl(), но я ведь не знаю дескрипторов открытых сокетов.

anonymous
()
Ответ на: комментарий от anonymous

можешь попробовать через /proc/$PID/fd

cvv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.