C++ 在fopen()之后和相应的fclose()之前使用system()(文件描述符泄漏)
我试图理解文件描述符泄漏问题的基本原理。(如果您不知道它是什么,只需发布一些符合示例的代码即可。) 到目前为止,我已经将应用程序分为几种类型。我想到的是,在POSIX中,通常调用其他程序的程序会非常谨慎,在不需要子进程处理的文件上设置CLOEXEC标志 但显然有些程序只使用标准C库,打开文件并调用系统命令 那么,在关闭fopen()之前,有没有一个例子(一个有效的程序)是fopen()是一个文件,system()是一个命令 我正在寻找C、Objective-C或PHP中的示例。其他语言也可以接受,只要它没有垃圾收集 2016-08-26 我猜纯C语言程序不会使用system()。因为:C++ 在fopen()之后和相应的fclose()之前使用system()(文件描述符泄漏),c++,c,memory-leaks,C++,C,Memory Leaks,我试图理解文件描述符泄漏问题的基本原理。(如果您不知道它是什么,只需发布一些符合示例的代码即可。) 到目前为止,我已经将应用程序分为几种类型。我想到的是,在POSIX中,通常调用其他程序的程序会非常谨慎,在不需要子进程处理的文件上设置CLOEXEC标志 但显然有些程序只使用标准C库,打开文件并调用系统命令 那么,在关闭fopen()之前,有没有一个例子(一个有效的程序)是fopen()是一个文件,system()是一个命令 我正在寻找C、Objective-C或PHP中的示例。其他语言也可以接受
但是,在我在Mac上查找XPC之后,我发现这些服务是由launchd启动的,并通过一些特殊属性将它们列为子进程。这意味着他们的FD表是干净的 C标准没有文件描述符的概念,因此没有文件描述符泄漏的概念 C实现如何准确地处理这个问题—通过对由
fopen
打开的任何文件描述符强制执行CLOEXEC
,或者在调用exec
之前手动关闭文件,或者完全忽略它—完全取决于实现
gcc
似乎忽略了这个问题,因此如果您的程序打开了太多文件并调用了system
,则system
调用的程序可能无法打开任何其他文件。下面是一个简单的演示:
#include <stdio.h>
#include <stdlib.h>
void toomanyfiles()
{
FILE* f = fopen("example.txt", "r");
if (f)
{
toomanyfiles();
fclose (f);
}
else
system ("cat example.txt");
}
int main ()
{
while (1)
{
system ("cat example.txt");
toomanyfiles();
}
}
#包括
#包括
void toomanyfiles()
{
文件*f=fopen(“example.txt”、“r”);
如果(f)
{
toomanyfiles();
fclose(f);
}
其他的
系统(“cat example.txt”);
}
int main()
{
而(1)
{
系统(“cat example.txt”);
toomanyfiles();
}
}
我很容易想到几十个这样做的例子,但其中没有一个是真正有用的程序——所有这些都只是为了利用系统功能,而不是提供功能
因此得出的结论是:在任何正确有效的编程范式中,这样的例子都不存在 我想你可能需要改写这个问题。在接近尾声之前,我一直打算把它当作马尔可夫链来写,但我仍然不确定你到底想要什么。@user4581301,我正在寻找一个只使用标准C库的程序,并在fopen()和fclose()之间调用system()。这是我问题的一部分。写这篇文章应该很简单。你为什么要看垃圾收集?垃圾收集释放内存,而不是文件句柄。第二,你担心什么?C和C++不知道文件描述符,这是POSIX的事情。C有“<代码>文件*<代码>,C++有<代码> STD::fStase,两者都没有继承。1)我不关心垃圾回收。我假定,在创建子进程之前,具有垃圾收集功能的进程会自动关闭过多的FD。2) 我想知道是否有有效的C程序会通过system()函数泄漏文件描述符。3) 我知道,我检查了FreeBSD源代码,它有一个特定于实现的标志来设置CLOEXEC标志,但大多数可移植程序不使用它,因此如果不使用fcntl,FDs可能会泄漏。这是一个利用系统的好例子,而不是一个有效的工作程序。我想除了学生的家庭作业,这样的项目在其他任何地方都不会存在。如果没有更好的答案,我就接受你的。谢谢。另外,你介意从编程实践的角度来讨论我的问题标题中提到的问题吗?一个草率的程序员可能会耗尽有限的操作系统资源。如果这是一个问题,那么解决方案就不能马虎。在这里,我没有看到任何特别适用于fopen和系统的东西。