2010-12-20 120 views
7

我在C程序中使用'fopen'以只读模式(r)打开文件。但就我而言,我观察到fopen调用不会返回。它不返回NULL或有效指针 - 执行在fopen调用时被阻塞。该补丁的文件是绝对正确的(我已经证实了这一点),并没有权限相关的问题。任何人都可以告诉可能是什么原因这种行为。任何形式的帮助都是非常可观的。有什么与gcc或glibc有关的吗?fopen不返回

编辑

下面是示例代码

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

+5

邮政码字符/块特殊文件。没有这个我们不能分辨。包含您传递给fopen的参数(包含值)。 – 2010-12-20 14:04:40

+0

如果你不能发布我们的代码,请在该场景中发布示例代码! – Sudantha 2010-12-20 14:05:45

+0

请指定文件系统的类型。 – Simone 2010-12-20 14:06:36

回答

2

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

1

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

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

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

+2

一个有趣的想法,但我没有看到任何锁定代码。即使Windows也允许在只读模式下通过多个进程打开文件。这个问题被标记为Linux,而Linux在这个意义上更加宽容。此外,他还说其他程序可以打开该文件。 – 2010-12-20 18:09:33

+1

有点相关:可能在开放文件列表锁上写入了互斥体,导致'fopen'永远挂在'pthread_mutex_lock'或等价物上。如果OP会听我们的任何答案并运行'strace',这可能会很快得到证实或驳斥。 – 2010-12-20 20:33:47

+0

@R ..:这是一个很好的观察。 – 2010-12-25 03:27:57

-1

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

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

+0

应该是一个评论。 – Stargateur 2017-07-03 23:53:52

5

这里有一些原因:

  • 你已经损坏的内存地方,所有的赌注都关闭为所发生的事情(通过运行Valgrind的程序)
  • 你调用一个信号处理程序中的代码,fopen()函数是不是信号异步安全,所以真的可能发生任何事情(由FILE *内部互斥造成的死锁是常见的,尽管如此)
  • 该文件是fifo,在这种情况下打开文件将阻塞,直到有人在另一端打开文件(读/写)
  • 该文件位于过时的NFS挂载点上。
  • 该文件与打开阻塞,直到一些有趣的事情发生了语义,
+0

尝试了一些其他PC上的相同的代码,它工作正常。不知道我的电脑出了什么问题。无论如何,非常感谢所有的帮助和建议。 – Souvik 2010-12-21 10:03:09