我编写了自己的find()函数。当我这样做时:
./myown $HOME/Documents test.txt
我得到:
/Users/CJ/Documents/test/test.txt
/Users/CJ/Documents/test/test1/test.txt
/Users/CJ/Documents/test/test2/test.txt
但是我什么时候做:
./myown $HOME test.txt
我得到:
getcwd error
我的getcwd代码在这里,它在一个辅助函数中:
findit(*directory, *pattern){
...
if(getcwd(cwd, 2048+1) == NULL){
fprintf(stderr, "getcwd error\n");
exit(1);
}
...
}
我该如何解决这个问题?
编辑:closedir()
解决了此问题,但现在还有另一个问题。当我执行./myown $HOME/Documents test.txt
时,结果是相同的,但是当我执行另一种方式时,得到的结果是:stat error
`
struct stat mode;
if(stat(entry->d_name, &mode) == -1){
fprintf(stderr, "stat error\n");
continue;
}`
我没有在代码的其他地方使用stat错误。
这也可能会有所帮助,这就是我使用open的方式
DIR *dir
dir = opendir(".");
错误出现在readdir()中。
答案 0 :(得分:2)
建议的调试步骤之一是:
由于
getcwd()
设置errno
失败时,您可能应该报告errno
,也许用perror("getcwd")
报告。尽管我不喜欢perror()
,但在这里可能是最简单的。
事实证明,错误集是EMFILE打开的文件太多。
所以,现在您知道了问题所在。
getcwd()
之所以失败,是因为您打开了很多文件,但没有关闭足够的文件,并且它需要一些可用的文件描述符,但是您没有留下任何可以使用的文件。
然后,在请求时,我用以下方法对此进行了详细说明:
您已打开文件和/或目录(使用
opendir()
打开目录通常使用文件描述符),但尚未关闭它们。因此,系统不允许您打开更多文件-getcwd()
失败。这可能不是立即的。您的程序可能在失败之前已经进行了一些处理。
观察到的OP:
我刚刚看到我没有使用
fclose
;给我一点时间,我会检查一下是否正确。
确保已经使用过fclose()
和closedir()
—如果您通过直接调用close()
使用了任何文件描述符,则可以使用普通open()
—应该会有所帮助。但是,如果对getcwd()
的调用是代码执行的第一件事,那不是因为您打开了许多文件(尚未打开)。
如果在关闭文件后仍然存在问题,则需要退后一步并查看较大的上下文。
例如: