$ HOME时发生getcwd错误

时间:2018-06-29 22:16:32

标签: c posix getcwd

我编写了自己的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()中。

1 个答案:

答案 0 :(得分:2)

建议的调试步骤之一是:

  

由于getcwd()设置errno失败时,您可能应该报告errno,也许用perror("getcwd")报告。尽管我不喜欢perror(),但在这里可能是最简单的。

事实证明,错误集是EMFILE打开的文件太多。

  

所以,现在您知道了问题所在。 getcwd()之所以失败,是因为您打开了很多文件,但没有关闭足够的文件,并且它需要一些可用的文件描述符,但是您没有留下任何可以使用的文件。

然后,在请求时,我用以下方法对此进行了详细说明:

  

您已打开文件和/或目录(使用opendir()打开目录通常使用文件描述符),但尚未关闭它们。因此,系统不允许您打开更多文件-getcwd()失败。这可能不是立即的。您的程序可能在失败之前已经进行了一些处理。

观察到的OP:

  

我刚刚看到我没有使用fclose;给我一点时间,我会检查一下是否正确。

确保已经使用过fclose()closedir() —如果您通过直接调用close()使用了任何文件描述符,则可以使用普通open() —应该会有所帮助。但是,如果对getcwd()的调用是代码执行的第一件事,那不是因为您打开了许多文件(尚未打开)。

如果在关闭文件后仍然存在问题,则需要退后一步并查看较大的上下文。

例如: