1

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

这也很有帮助,这就是我使用 open 的方式

DIR *dir dir = opendir(".");

错误在 readdir() 中。

4

1 回答 1

2

建议的调试步骤是:

由于getcwd()设置errno失败时,您可能应该报告errno,也许使用perror("getcwd"). 虽然我不热衷perror(),但这里可能是最简单的。

事实证明,错误集是 EMFILE Too many open files。

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

并且,当被要求时,我详细说明了这一点:

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

OP观察到:

我刚看到我没用过fclose;给我一秒钟,如果是这样,我会检查它。

确保你已经使用过fclose()并且closedir()——close()如果你通过直接调用使用了任何文件描述符,那么简单明了open()——应该会有所帮助。但是,如果调用getcwd()是您的代码所做的第一件事,那不是因为您打开了许多文件(您没有打开)。

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

例如:

于 2018-06-29T22:56:16.587 回答