首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fopen不返回

fopen不返回
EN

Stack Overflow用户
提问于 2010-12-20 14:02:50
回答 3查看 7.8K关注 0票数 9

我在C程序中使用“fopen”以只读模式(r)打开文件。但在我的例子中,我观察到fopen呼叫不会返回。它不返回NULL或有效指针-执行在fopen调用时会被阻塞。该修补程序的文件是绝对正确的(我已经验证过),并且没有权限相关的问题。有谁能说出这种行为的原因是什么?任何帮助都是值得赞赏的。有什么与gcc或滑翔有关的吗?

编辑

下面是示例代码

代码语言:javascript
复制
printf("%s %d\n",__FUNCTION__,__LINE__);
if ((fp = fopen(argv[1], "r")) == NULL) {
   printf("%s %d\n",__FUNCTION__,__LINE__);
   return;
}
printf("%s %d\n",__FUNCTION__,__LINE__);

当我运行这段代码时,我只得到第一次打印(在调用fopen之前),在该程序停止之后。所以fopen没有完成它的操作。该文件是一个具有'.conf‘扩展名的简单配置文件,该文件可以通过其他方式打开,如vi、cat等。不应该存在任何NFS相关问题。文件系统是ext3。

提前谢谢你,苏维克

EN

回答 3

Stack Overflow用户

发布于 2010-12-20 21:58:32

以下是几个原因:

  • 您已经在某个地方损坏了内存,并且所有的赌注都不知道发生了什么(运行您的程序通过val差使)
  • 在信号处理程序中调用此代码,fopen()并不是信号异步安全,因此任何事情都可能发生(由于文件*内部互斥是常见的死锁)。
  • 该文件是一个fifo,在这种情况下,打开文件将被阻塞,直到有人在另一端打开该文件(读/写)
  • 该文件位于过时的NFS挂载上。
  • 该文件是一个字符/块特殊文件,具有语义,打开时会阻塞,直到发生有趣的事情,
票数 7
EN

Stack Overflow用户

发布于 2010-12-20 15:15:12

那又怎么样?允许fopen阻塞,直到文件被打开,或者直到确定访问被拒绝为止。如果您有一个缓慢的存储设备,等待它变得可用是绝对正确的。但这是操作系统问题,而不是C问题。

票数 2
EN

Stack Overflow用户

发布于 2010-12-20 20:28:10

您是否可能在保留名称空间中重新定义了符号:以两个下划线、下划线和大写字母开头的符号,还是任何标准C库函数?如果是这样的话,这会导致未定义的行为,而且fopen可能会以某种方式调用代码的一部分,而不是标准库中的正确代码。

这个问题有很大的“信息缺失”的味道。我非常怀疑问题中的代码片段是否具有OP在main中单独出现时所描述的行为,并且不知道OP是否做了一些他没有告诉我们的虚假的事情。

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

https://stackoverflow.com/questions/4490343

复制
相关文章

相似问题

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