我有一个用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监视打开的文件。
答案 0 :(得分:4)
听起来你正在泄漏文件描述符。
答案 1 :(得分:3)
在类似Unix的系统上,子进程继承父进程的打开文件描述符。但是,当子进程退出时,它会关闭打开的文件描述符的所有副本,但不会关闭父进程的副本。
因此,您在父级中打开文件描述符而不是关闭它们。我敢打赌,你没有关闭proc_open()
电话回复的管道。
您还需要拨打proc_close()
。
答案 2 :(得分:0)
是的,看起来你正在打开进程,但是在使用后不要关闭它们 - 看起来 - 它们不会自动关闭(在某些情况下可能会起作用)。
如果您不再使用该资源,请务必使用proc_close($res)
关闭/终止您的流程。
答案 3 :(得分:-2)
您的应用程序没有关闭它的文件/套接字您可以尝试使用ulimit系统调用,您可以删除每个应用程序允许的打开文件数。看看:man ulimit