Приложение C ++ рушится через несколько часов - PullRequest
1 голос
/ 11 мая 2011

У меня есть приложение, написанное на 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 &'

И curl тоже не работает:

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 потоков и присоединяет их.

Ответы [ 4 ]

4 голосов
/ 11 мая 2011

Звучит так, как будто вы пропускаете файловые дескрипторы.

3 голосов
/ 11 мая 2011

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

Итак, вы открываете дескрипторы файлов в родительском файле, а не закрываете их. Держу пари, что вы не закрываете каналы, возвращаемые вызовом proc_open().

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

0 голосов
/ 11 мая 2011

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

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

0 голосов
/ 11 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...