Russian Qt Forum

Программирование => С/C++ => Тема начата: dssoft от Июль 19, 2005, 23:47



Название: Проблемы с демоном в Linux
Отправлено: dssoft от Июль 19, 2005, 23:47
На днях столкнулся с такой вот проблемой.

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

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

Затем мне понадобилось перезапустить 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.

Как можно справиться с этой проблемой? Т.е. чтобы моя программа не начинала слушать порты Web-сервера после его остановки.

Спасибо.


Название: Проблемы с демоном в Linux
Отправлено: DmitriyDMA от Февраль 21, 2006, 14:19
Создается впечатление что когда вы делаете fork() то новый процесс получает копию памяти веб-сервера и соответственно объект(или неважно что) который слушает tcp порт. Надо делать fork из чистого процесса не знаю каким образом, или удалять ненужные объекты. Можно посмотреть на vfork   он вроде не делает копию адресного пространства родительского процесса.