C++应用程序在几个小时后崩溃


C++ application collapsing after some hours

我有一个用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 和 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 进程。

在"比较器"中,我正在关闭所有打开的文件。也许不会释放所有mutex_destroy互斥锁...但是在每个迭代器中,C ++应用程序都是关闭的,我认为所有的东西都已发布了,对吗?

我必须注意什么?我尝试使用 stof 监控打开的文件。


  • 菲律宾比索 5.2
  • 盛科 5.X
  • 1 GB 内存
  • 120 GB 硬盘(已使用 4%)
  • 4 x 英特尔至强
  • 是一个VPS(机器有16 GB内存)
  • 该进程打开 10 个线程并加入它们。

听起来你正在泄漏文件描述符。

在类 Unix 系统上,子进程继承父进程的打开文件描述符。 但是,当子进程退出时,它确实会关闭打开文件描述符的所有副本,但不会关闭父进程的副本。

因此,您是在父级中打开文件描述符,而不是关闭它们。我敢打赌,您不会关闭proc_open()调用返回的管道。

您还需要致电proc_close()

是的,看起来您正在打开进程,但在使用后不要关闭它们,并且 - 看起来 - 它们不会自动关闭(在某些情况下可能有效)。

如果您不再使用该资源,请确保使用 proc_close($res) 关闭/终止您的流程。

您的应用程序没有关闭它的文件/套接字,您可以尝试使用 ulimit 系统调用,您可以删除每个应用程序允许的打开文件数。看一看:男人 ulimit