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

时间:2011-05-11 09:37:05

标签: php c++ c linux centos

我有一个用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 GB ram
  • 120 gb硬盘(使用4%)
  • 4 x intel xeon
  • 是VPS(机器有16 gb ram)
  • 该过程打开10个线程并加入它们。

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

因此,您在父级中打开文件描述符而不是关闭它们。我敢打赌,你没有关闭proc_open()电话回复的管道。

您还需要拨打proc_close()

答案 2 :(得分:0)

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

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

答案 3 :(得分:-2)

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