fopen没有回来

时间:2010-12-20 14:02:50

标签: c linux fopen

我在C程序中使用'fopen'来以只读模式(r)打开文件。但在我的情况下,我发现fopen电话不会返回。它不返回NULL或有效指针 - 执行在fopen调用时被阻止。文件补丁是绝对正确的(我已经验证过)并且没有与权限相关的问题。任何人都可以告诉我这种行为可能是什么原因。任何形式的帮助都是值得的。有什么与gcc或glibc有关吗?

修改

以下是示例代码

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。

提前致谢, Souvik

4 个答案:

答案 0 :(得分:6)

以下是几个原因:

  • 你已经在某个地方损坏了内存,所有的赌注都是关于发生的事情(通过valgrind运行你的程序)
  • 你在信号处理程序中调用此代码,fopen()不是信号异步安全,所以实际上可能发生任何事情(由于FILE *内部互斥锁导致的死锁很常见)
  • 该文件是fifo,在这种情况下打开文件将被阻止,直到有人在另一端打开文件(读/写)
  • 该文件位于过时的NFS挂载上。
  • 该文件是一个字符/块特殊文件,其语义可以打开阻塞,直到发生一些有趣的事情,

答案 1 :(得分:2)

那又怎样?允许fopen阻塞,直到文件被打开,或者直到确定访问被拒绝为止。如果您的存储设备速度较慢,则等到可用时才是绝对正确的。但那是一个操作系统问题,而不是C的。

答案 2 :(得分:1)

如果您成功打开文件,我发现您不会关闭该文件。

你有没有可能在之前运行它并杀死它,现在你有一个进程,文件打开并锁定?

如果是这样,那么fopen可能正在等待释放锁。

答案 3 :(得分:-1)

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

这个问题有一个重要的“缺失信息”气味。我严重怀疑问题中的代码片段是OP在main中单独出现时所描述的行为,我想知道OP是否还没有做过一些他没有告诉我们的虚假内容......