Сбой приложения C ++ через несколько часов

У меня есть приложение, написанное на C ++, которое использует opencv 2.0, curl и библиотеку opensurf. Сначала PHP-скрипт (cron.php) вызывает proc_open и вызывает приложение C ++ (называемое icomparer). Когда он заканчивает обработку N изображений, возвращается группы, говорящие, какие изображения одинаковы, после чего скрипт использует:

shell_exec('php cron.php > /dev/null 2>&1 &'); die; 

И снова начинается. Ну, после 800 или 900 повторений мой icomparer начинает ломаться. Система не позволяет мне создавать больше файлов, в icomparer и в php-скрипте.

 proc_open(): unable to create pipe Too many open files (2) shell_exec(): Unable to execute 'php cron.php > /dev/null 2>&1 &' 

И скручивание терпит неудачу:

 couldn't resolve host name (6) 

Все падает. Я думаю, что я делаю что-то неправильно, например, я не знаю, начинаю ли другой PHP-процесс из ресурсов выпуска PHP-процессов.

В «icomparer» я закрываю все открытые файлы. Возможно, не выпуская все мьютексы с mutex_destroy … но в каждом итераторе приложение c ++ закрыто, я думаю, что все вещи выпущены правильно?

Для чего я должен следить? Я пробовал просматривать открытые файлы с помощью stof.


  • Php 5.2
  • Centos 5.X
  • 1 ГБ оперативной памяти
  • 120 ГБ жесткий диск (4% используется)
  • 4 x intel xeon
  • Является ли VPS (машина имеет 16 ГБ оперативной памяти)
  • Процесс открывает 10 потоков и соединяет их.

В Unix-подобных системах дочерние процессы наследуют дескрипторы открытых файлов родителя. Однако, когда дочерний процесс завершается, он закрывает все свои копии дескрипторов открытых файлов, но не копии родителя.

Таким образом, вы открываете дескрипторы файлов в родительском объекте и не закрываете их. Моя ставка заключается в том, что вы не закрываете каналы, возвращенные proc_open() .

И вам также нужно будет вызвать proc_close() .

Похоже, вы пропускаете дескрипторы файлов.

Да, похоже, что вы открываете процессы, но не закрываете их после использования, и, как кажется, они не закрываются автоматически (что может работать при некоторых обстоятельствах).

Убедитесь, что вы закрываете / завершаете процесс с помощью proc_close($res) если вы больше не используете ресурс.

Ваше приложение не закрывает файлы / сокеты, которые вы можете использовать с помощью командной строки ulimit, при этом вы можете удалить количество открытых файлов, разрешенных для каждого приложения. Посмотрите: man ulimit