Ç - 有道同时使用open()和fdopen何时关闭文件()(C - Proper way to

2019-07-04 11:27发布

所以我建立在C的Unix minishell,和我实现输入,输出和犯错重定向,以及所遇到的一个问题的文件。 我在一个循环,我发现重定向操作符打开我的文件,并使用open(),它返回一个FD。 我然后相应地分配孩子的fd,并调用执行的功能。

当我的壳是刚刚走出去,寻找项目,并与execvp()执行它们,我没有太大的问题。 唯一的问题是要知道我是否需要提示的下一个命令行之前的文件描述符调用close()。 我担心的是具有FD泄漏,但不完全了解它是如何工作的。

使用内置命令时,我真正的问题出现了。 我有一个内置的命令叫做“读”,它有一个参数,环境变量名(可能是一个尚不存在)。 阅读然后提示值,并且将该值分配给变量。 下面是一个例子:

% read TESTVAR
test value test value test value
% echo  ${TESTVAR}
test value test value test value

好让说,我尝试是这样的:

% echo here's another test value > f1
% read TESTVAR < f1
% echo  ${TESTVAR}
here's another test value

这个伟大的工程,记住,阅读父进程内执行,我不调用execvp读,因为它的内置。 阅读用途得到,这需要一个流变量,而不是FD。 所以经过周围戳在IRC论坛有点有人告诉我用fdopen,摆脱文件描述符流。 因此调用天黑之前,我打电话:

rdStream = fdopen(inFD, "r");

然后调用

if(fgets(buffer, envValLen, rdStream) != buffer) 
{
    if(inFD) fclose(rdStream);
    return -1;
}
if(inFD) fclose(rdStream);

正如你所看到的,在那一刻,我关闭与FCLOSE(流),除非它等于标准输入(即0)。 这是必要的吗? 我是否需要关闭流? 或者只是文件描述符? 或两者? 我对我应该关闭,因为它们都指向同一个文件,以不同的方式很困惑。 目前我不收的FD,不过我想我一定要。 我只是想有人来帮助确保我的外壳是不漏任何文件,因为我希望它能够在一个会话中执行几千命令,不泄漏内存。

谢谢你,如果你们要我再张贴代码只问。

Answer 1:

该标准指出:

所述FCLOSE()函数应执行的等效close()与该流指向由该数据流相关联的文件描述符。

因此调用fclose就够了; 它也将关闭描述符。



Answer 2:

FILE是从标准C库缓冲对象。 当你做fclose (标准C函数),它最终会调用close (在Unix系统的功能),但只有确保C库缓冲区后刷新。 所以,我想说,如果你使用fopenfwrite那么你应该使用fclose ,而不仅仅是close ,否则你可能失去一些数据。



文章来源: C - Proper way to close files when using both open() and fdopen()