Closed. This question does not meet
Stack Overflow guidelines。它当前不接受答案。
想改善这个问题吗?更新问题,以便将其作为
on-topic用于堆栈溢出。
4年前关闭。
Improve this question
我正在尝试了解文件描述符泄漏问题的基础。 (如果您不知道它是什么,只需发布一些适合示例的代码即可。)
到目前为止,我已经将应用程序分为几种类型。我想到的是,通常在POSIX中,调用其他程序的程序要足够谨慎,以便在不需要子进程处理的文件上设置CLOEXEC标志。
但是显然有些程序只使用标准C库,并打开文件并调用系统命令。
那么,有没有一个(有效程序的)示例,它在close()之前将其fopen()s一个文件,system()一个命令?
我正在寻找C,Objective-C或PHP中的示例。只要没有垃圾回收,其他语言也可以接受。
2016-08-26
我想纯C语言程序不会使用system()。因为:
他们不知道哪些系统命令可用。 人们知道哪些系统命令可用,通常知道如何通过库例程使用这些功能。 在任何平台上,system()都不可能等同于GNU syscall()函数。 对于那些不清楚我要什么的人,我要求一个有效的工作程序示例,该程序(可能由于不良的编程习惯)在FILE *为fopen()时使用system()命令。的。这是为了帮助我(和其他人)了解文件描述符泄漏问题的基础。
也
我注意到某些Apple Pro应用程序(例如Final Cut Pro X)具有处理媒体文件解码和帧渲染的子进程。起初,我认为这些将是打开文件并创建子进程的应用程序的有效示例。
但是,当我在Mac上查找XPC之后,我发现这些服务是通过启动启动的,并通过一些特殊属性将它们列出为子进程。这意味着它们的FD表是干净的。
C标准没有文件描述符的概念,因此没有文件描述符泄漏的概念。
C实现如何完全解决该问题(通过在由CLOEXEC
打开的任何文件描述符上强制fopen
,或在调用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();
}
}