2012-10-12 51 views
0

我已經寫了一個C程序來將一系列字符寫入文件--5個字母數字,後跟一個(char)(30),'記錄分隔符'性格,重複...沒有新行。該程序能夠完美循環,直到達到第508次迭代--3048個字符 - 然後死亡,並說我無法訪問該文件。Unix上C上的文件寫入程序卡在508打開/關閉週期

該方案的結構就必須關閉並且每到這個序列被寫入(腳本是一個較大的僞數據庫模擬模塊的一部分)時的文件的重新打開,所以有508個循環通過打開/寫/關閉過程......在我開始剖析數據庫模塊代碼(其中有很多行,所以我寧願不必如果我可以避免它),我想知道是否有人知道很少遇到的讀取Unix下的寫入限制或在某個時間限制下文件中有3048個字符的問題,或文件中存在508 {30}的問題,或者這樣的簡單(但難以捕捉)的問題。我試圖將讀/寫延遲幾毫秒,而不是偶然發生,因爲它會被打開,或像這樣跳過自身,但不會有雪茄。

+4

爲什麼你不給我們展示這個問題的最小樣本?機會是你正在泄漏資源(緩衝區,文件描述符,其他東西) – sehe

回答

6

508可疑地接近512,這是合理的打開文件數的缺省值。輸入命令ulimit -a並查看施加了什麼限制。在我的Fedora 15系統,1024是每個進程打開的文件數限制:

[[email protected] ~]$ ulimit -a 
core file size   (blocks, -c) 0 
data seg size   (kbytes, -d) unlimited 
scheduling priority    (-e) 0 
file size    (blocks, -f) unlimited 
pending signals     (-i) 22084 
max locked memory  (kbytes, -l) 64 
max memory size   (kbytes, -m) unlimited 
open files      (-n) 1024 
pipe size   (512 bytes, -p) 8 
POSIX message queues  (bytes, -q) 819200 
real-time priority    (-r) 0 
stack size    (kbytes, -s) 8192 
cpu time    (seconds, -t) unlimited 
max user processes    (-u) 1024 
virtual memory   (kbytes, -v) unlimited 
file locks      (-x) unlimited 

如果你是512,請確保該程序實際上是關閉文件。沒有顯示一些代碼,我們所能做的只是猜測。

+0

也運行'lsof -p pid-of-your-program'應該告訴你,如果你正在泄漏文件描述符(如果你有打開的文件,你永遠不會收盤)。 –

+0

或只是'find/proc/$ PID/fd'。無論如何,這當然不是一個真正的答案(國際海事組織沒有真正的問題) – sehe

+3

* 508可疑地接近512 *:是的,再加上stdin,stdout和stderr可以讓你一直到511.(即:x <512):-) –

相關問題