fopen不返回

我在C程序中使用'fopen'以只读模式(r)打开一个文件。 但在我的情况下,我观​​察到fopen调用不会返回。 它不返回NULL或有效的指针 – 执行被阻止在fopen调用。 该补丁的文件是绝对正确的(我已经validation),并没有权限相关的问题。 任何人都可以告诉可能是什么原因这种行为。 任何forms的帮助都是非常可观的。 有什么和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”的简单configuration文件,该文件可以通过vi,cat等其他方式打开。不应该有任何NFS相关的问题。 文件系统是ext3。

在此先感谢,Souvik

Solutions Collecting From Web of "fopen不返回"

这有几个原因:

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

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

我注意到,如果您成功打开文件,则不会关闭该文件。

是否有可能你之前运行过它并将其杀死,现在你有一个进程在那里打开文件并锁定?

如果是这样,那么也许fopen正在等待锁被释放。

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

这个问题有一个主要的“缺少的信息”的气味。 我严重怀疑在问题中的代码片段有行为OP已经描述,当它本身出现在main ,我不知道OP是否做了一些假的东西,他没有告诉我们… …