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开始打破。 系统不会让我创build更多的文件,在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”我closures所有打开的文件。 也许不释放mutex_destroy所有的互斥体…但在每个迭代器的c + +应用程序是封闭的,我认为所有的东西被释放的权利?

我必须注意什么? 我试图用stof监视打开的文件。


  • Php 5.2
  • Centos 5.X
  • 1 GB RAM
  • 120 GB硬盘(使用4%)
  • 4 x intel xeon
  • 是一个VPS(机器有16 GB RAM)
  • 该过程打开10个线程并join它们。

Solutions Collecting From Web of "C ++应用程序在几个小时后崩溃"

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

所以你打开父文件描述符,而不是关闭它们。 我敢打赌,你没有关闭由proc_open()调用返回的管道。

而且你也需要调用proc_close()

听起来像是在泄漏文件描述符。

是的,它看起来像你正在打开进程,但不要在使用后关闭它们, – 看起来 – 它们不会自动关闭(这可能在某些情况下)。

如果你不再使用这个资源,确保你用proc_close($res)关闭/终止你的进程。

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