[问题] popen错误问题

楼主: wind00962 (Light)   2015-06-14 11:44:53
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
linux
问题(Question):
出现too many open file
程式码(Code):(请善用置底文网页, 记得排版)
FILE *fp;
char bufferp[100];
while(1){
fp = popen("ls /tmp/file","r");
if (fp != NULL){
if(fgets(buffer,sizeof(buffer),fp) == NULL){
printf("no file\n");
}else
printf("have file");
}else{
perror("popen");
}
pclose(fp)
sleep(1);
}
跑大概两个小时会出现too many open file错误,但我都有正常关闭档案,为什么会出现
这种错误呢? 谢谢
作者: Hazukashiine (私は幸せです)   2015-06-14 12:03:00
通常会出现这个问题是因为 file handle leak有“可能”是因为没有完成 destroy 所以到达 limit肮脏的手法是直接 ulimit -n <fd-num> 来加大 limit虽然这不能从根本上解决问题,不过毕竟是有效的解决不然可以修改 /proc/sys/fs/file-max如果有强迫症的话,用 lsof 看一下到底有哪些档案并没有被关闭,还正在被你的程式读取
楼主: wind00962 (Light)   2015-06-14 12:09:00
因这要跑无限个小时,又算加大应该还是会有问题
作者: Hazukashiine (私は幸せです)   2015-06-14 12:10:00
那就用 lsof 先确认到底是哪些档案没有 pclose 到哦~对了,你用 popen 的话好像不能这样弄那就先检查一下 pclose 的回传值The pclose() function returns -1 if wait4(2)returns an error,or some other error is detected还有,你没有检查回传值,怎么知道是否正常关闭档案
楼主: wind00962 (Light)   2015-06-14 12:27:00
感谢,我在试看看那关闭回传值错误,我要怎继续这个程式呢?
作者: Hazukashiine (私は幸せです)   2015-06-14 12:31:00
先把 sleep(1) 拿掉试试看吧

Links booklink

Contact Us: admin [ a t ] ucptt.com