2010-12-20 68 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

相關問題