2012-10-12 28 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):-) –

相关问题