我在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
答案 0 :(得分:6)
以下是几个原因:
答案 1 :(得分:2)
那又怎样?允许fopen阻塞,直到文件被打开,或者直到确定访问被拒绝为止。如果您的存储设备速度较慢,则等到可用时才是绝对正确的。但那是一个操作系统问题,而不是C的。
答案 2 :(得分:1)
如果您成功打开文件,我发现您不会关闭该文件。
你有没有可能在之前运行它并杀死它,现在你有一个进程,文件打开并锁定?
如果是这样,那么fopen可能正在等待释放锁。
答案 3 :(得分:-1)
您是否有可能在保留命名空间中重新定义了一个符号:以两个下划线,下划线和大写字母开头的内容,还是任何标准C库函数?如果是这样,那将导致未定义的行为,并且fopen
可能以某种方式最终调用代码的一部分而不是标准库中的正确代码。
这个问题有一个重要的“缺失信息”气味。我严重怀疑问题中的代码片段是OP在main
中单独出现时所描述的行为,我想知道OP是否还没有做过一些他没有告诉我们的虚假内容......