我编写了自己的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代码在这里,它在一个helper函数中:
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 error。
这也很有帮助,这就是我使用open的方法。
DIR *dir dir = opendir(".");
错误在readdir()中。
发布于 2018-06-30 06:56:17
一个建议的调试步骤是:
由于
getcwd()会在失败时设置errno,因此您可能应该报告errno,也许可以使用perror("getcwd")。虽然我对perror()不感兴趣,但在这里可能是最简单的。
原来,错误集是EMFILE Too open files。
好了,现在你知道问题出在哪里了。getcwd()失败是因为您打开了很多文件,但没有关闭足够的文件,它需要一些可用的文件描述符,但您没有留下任何可供它使用的文件描述符。
在收到请求时,我详细说明了这一点:
您已经打开了文件和/或目录(使用
opendir()打开目录通常使用文件描述符),但您尚未关闭它们。因此,系统不允许您打开更多的文件-并且getcwd()失败。它可能不是直接的;您的程序可能在失败之前已经做了一些处理。
OP观察到:
我刚刚发现我还没有用过
fclose;请稍等,我会检查一下是否就是这样。
确保您使用过fclose()和closedir() -如果您通过直接调用close()使用过任何文件描述符,则还要使用普通的open() -应该会有所帮助。但是,如果对getcwd()的调用是您的代码要做的第一件事,那就不会是因为您打开了很多文件(您还没有打开)。
如果在关闭文件后仍然存在问题,那么您需要后退一步,并检查更大的上下文。
例如:
https://stackoverflow.com/questions/51110046
复制相似问题