首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关闭文件的文件

关闭文件的文件
EN

Stack Overflow用户
提问于 2017-12-30 18:17:38
回答 1查看 395关注 0票数 0

我有这样一个函数,它的目的是读取一个文件:

int foo(FILE* f)

我想使用flock来防止TOCTTOU。flock需要一个整数的文件描述符。我可以使用fileno(file)实现这一点。因此,foo的实现可能如下所示:

代码语言:javascript
复制
int foo(FILE* f) {
  if(!f) return -1;
  int fd = fileno(f);
  if(fd < 0) return -1;
  flock(fd, LOCK_EX);
  //do all the reading stuff and so on.
} 

但是,邪恶的用户可能会这样做:

代码语言:javascript
复制
FILE* test;
test = fopen("someexistingfile.txt", "r");
fclose(test);
foo(test);

然后,我遇到了一个问题,因为fileno将根据val差制进行无效读取,因为它假定文件是打开的。

关于如何检查文件是否已关闭,有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-30 19:15:43

C11 n1570 7.21.3p4

  1. 通过关闭文件,可以将文件与控制流分离。在流与文件断开关联之前,刷新输出流(将任何未写入的缓冲区内容传输到主机环境)。指向FILE 对象的指针的值在关联文件关闭后为不确定值,(包括标准文本流)。一个零长度的文件(输出流没有写字符)是否真的存在是实现定义的。

fclose之后,在库函数中使用FILE *值会导致未定义的行为。在重新分配之前,指针的值根本无法安全地用于任何事情。

换句话说,您根本不可能做任何事情来区分您给出的FILE *值是否引用了一个有效的打开文件.除了针对NULL的测试--如果指针的值是NULL,它肯定不能指向打开的流。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48036658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档