gpt4 book ai didi

C - 使用 open() 和 fdopen() 时关闭文件的正确方法

转载 作者:太空狗 更新时间:2023-10-29 17:09:30 24 4
gpt4 key购买 nike

因此,我正在用 C 构建一个 Unix minishell,并正在实现输入、输出和错误重定向,并且遇到了文件问题。我在找到重定向运算符的循环中打开我的文件,并使用 open(),它返回一个 fd。然后我相应地分配 child 的 fd,并调用执行函数。

当我的 shell 刚刚出去寻找程序,并使用 execvp() 执行它们时,我没有太大问题。唯一的问题是在提示输入下一个命令行之前知道我是否需要在文件描述符上调用 close() 。我担心 fd 泄漏,但不完全了解它是如何工作的。

我真正的问题出现在使用内置命令时。我有一个名为“read”的内置命令,它接受一个参数,一个环境变量名称(可能是一个尚不存在的名称)。 Read 然后提示输入一个值,并将该值分配给变量。这是一个例子:

% 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

这很好用,请记住 read 在父进程内执行,我不使用 execvp 调用 read 因为它是内置的。 read使用gets,需要的是stream变量,不是fd。所以在 irc 论坛上闲逛了一下后,我被告知使用 fdopen,从文件描述符中获取流。所以在调用 gets 之前,我调用:

rdStream = fdopen(inFD, "r");

然后调用

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

如您所见,目前我正在使用 fclose() 关闭流,除非它等于标准输入(即 0)。这是必要的吗?我需要关闭流吗?或者只是文件描述符?或两者?我很困惑我应该关闭哪个,因为它们都以不同的方式引用同一个文件。目前我没有关闭 fd,但我认为我绝对应该关闭。我只是希望有人帮助确保我的 shell 没有泄漏任何文件,因为我希望它能够在一个 session 中执行几千条命令而不会泄漏内存。

谢谢,如果你们想让我再发布代码,尽管问。

最佳答案

standard说:

The fclose() function shall perform the equivalent of a close() on the file descriptor that is associated with the stream pointed to by stream.

所以调用fclose就足够了;它还将关闭描述符。

关于C - 使用 open() 和 fdopen() 时关闭文件的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13691107/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com