C++ 在fopen()之后和相应的fclose()之前使用system()(文件描述符泄漏)

C++ 在fopen()之后和相应的fclose()之前使用system()(文件描述符泄漏),c++,c,memory-leaks,C++,C,Memory Leaks,我试图理解文件描述符泄漏问题的基本原理。(如果您不知道它是什么,只需发布一些符合示例的代码即可。) 到目前为止,我已经将应用程序分为几种类型。我想到的是,在POSIX中,通常调用其他程序的程序会非常谨慎,在不需要子进程处理的文件上设置CLOEXEC标志 但显然有些程序只使用标准C库,打开文件并调用系统命令 那么,在关闭fopen()之前,有没有一个例子(一个有效的程序)是fopen()是一个文件,system()是一个命令 我正在寻找C、Objective-C或PHP中的示例。其他语言也可以接受

我试图理解文件描述符泄漏问题的基本原理。(如果您不知道它是什么,只需发布一些符合示例的代码即可。)

到目前为止,我已经将应用程序分为几种类型。我想到的是,在POSIX中,通常调用其他程序的程序会非常谨慎,在不需要子进程处理的文件上设置CLOEXEC标志

但显然有些程序只使用标准C库,打开文件并调用系统命令

那么,在关闭fopen()之前,有没有一个例子(一个有效的程序)是fopen()是一个文件,system()是一个命令

我正在寻找C、Objective-C或PHP中的示例。其他语言也可以接受,只要它没有垃圾收集

2016-08-26 我猜纯C语言程序不会使用system()。因为:

  • 他们不知道有哪些系统命令可用
  • 知道哪些系统命令可用,通常知道如何通过库例程使用这些功能
  • 在任何平台上,system()都不可能等同于GNU syscall()函数 对于那些不太清楚我要求的内容的人,我要求提供一个有效的工作程序示例(可能是由于糟糕的编程实践),该程序在文件被fopen()打开时使用system()命令。这是为了帮助我(和其他人)理解文件描述符泄漏问题的根本

    阿尔索 我注意到一些Apple Pro应用程序,如Final Cut Pro X,都有处理媒体文件解码和帧渲染的子进程。起初,我认为这些是打开文件并创建子进程的应用程序的有效示例


    但是,在我在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和系统的东西。