调试C中的递归线程调用

调试C中的递归线程调用,c,multithreading,directory,C,Multithreading,Directory,在过去的一天半时间里,每当我有空的时候,我都在试着调试我的代码,我不知道我的代码出了什么问题。当我将close()函数添加到递归调用时,程序会给我一个无效指针。但是,当我删除close()函数调用时,程序运行正常,只是它没有执行它应该执行的操作,即: 将用户中的所有文件大小相加 输入目录 打开子目录(如果有),然后添加 把里面的所有文件都整理好 子目录 相反,它将输入目录中的所有文件大小相加,并能够打开最后一个子目录,将该目录中的文件添加到总文件大小计数中 我正在尝试用线程来实现这一点。ma

在过去的一天半时间里,每当我有空的时候,我都在试着调试我的代码,我不知道我的代码出了什么问题。当我将
close()
函数添加到递归调用时,程序会给我一个无效指针。但是,当我删除
close()
函数调用时,程序运行正常,只是它没有执行它应该执行的操作,即:

  • 将用户中的所有文件大小相加 输入目录
  • 打开子目录(如果有),然后添加 把里面的所有文件都整理好 子目录
相反,它将输入目录中的所有文件大小相加,并能够打开最后一个子目录,将该目录中的文件添加到总文件大小计数中

我正在尝试用线程来实现这一点。
main()
函数从用户输入目录创建一个主线程,并立即运行
opendirectory()

/*
 * Iterates through given directory
 */
void *opendirectory(void *t)
{
 pthread_mutex_lock(&dirlock);
 DIR *dpntr;
 struct dirent *dentry;
 char new_directory[512], dir = t;

 printf("OPENING DIRECTORY ... %s\n", t);

 /* Checks if given directory can be opened */
 if((dpntr = opendir(t)) == NULL) {
  printf("DIRECTORY FAILED ...%s\n",t);
  perror("ERROR -- COULD NOT OPEN DIR");
  pthread_exit(NULL);
 }

 printf("DIRECTORY OPENED: %s\n", t);

 /* Read each file in current directory */
 while ((dentry = readdir(dpntr)) != NULL ) {
  /* Ignore special directories */
  if(strcmp(dentry -> d_name, ".") == 0 || strcmp(dentry -> d_name, "..") == 0) {
   continue;
  } else {
   compilelist( t, dentry->d_name );
  }
 }

 pthread_mutex_unlock(&dirlock);
 /* Checks if directory can be closed */
 if(closedir(dpntr) < 0)
  printf("ERROR CLOSING %s.\n", t);

}
这是
main()

我觉得在
compilelist()
函数底部调用的
pthread\u create()
工作不正常。threads[]指的是默认大小为20的全局线程数组,假设总共不超过20个目录。由于用户的输入目录,dirCount从1开始,并随着遇到新目录而增加。

第一个问题:

过去一天半我有空的时候

不要那样做,你的大脑不是为它而建的。分配时间,告诉你的同事/妻子和孩子,如果他们在这段时间打扰你,会有枪声和警察介入:-)

其他问题:不知道(因此是社区wiki)。

您的代码:

dpntr = opendir(t)

if(closedir(t)<0)
应该是:

if(closedir(dpntr) < 0)
if(closedir(dpntr)<0)

在这里,我发现您的代码有两个问题:

  • 如wrang wrang所述,closedir(t)导致SEGFULT

  • compilelist()的“char filepathname[512];”是一个本地内存缓冲区,但您可以将其传递给线程(opendirectory)并持续使用。您应该改用复制或动态分配

  • 埃福Upd@2009nov17:
    在修复了以上2点之后,到目前为止,它在我的FC9 x86_64上运行良好。顺便说一句:线程数20是不够的。

    如果你想得到这方面的帮助,你必须提供完整的源代码(dPtr声明在哪里?dir=t是错误的,等等)。你能将代码发布到main()吗?或者至少你在哪里设置线程属性/处理连接/等等?我会在一点时间内编辑我的帖子,但当我在想一种方法使其递归时,我将我的大部分变量设置为全局变量。。。可能是一个非常新手的错误,但任何指点都将是伟大的!我正在将一些指针从全局改为本地。有一件事需要注意,@Kenji(我认为这不是你的具体问题)。粗略地看一眼,我看不出有什么东西能阻止主线程在你的子线程有机会使用它之前(通过dPtr指针)更改文件路径名。我想你可能发现了什么,我正在尝试将一些全局变量切换到局部变量,并准备重新编译…@Kenji,在这种情况下,我倾向于使用一个受互斥保护的标志变量。主线程在创建子线程之前将其设置为1,然后循环直到其为0。子线程将相关数据(数据,而不是指向数据的指针)复制到本地存储,然后将其设置为0并继续。这保证了每个线程都不会踩在另一个线程上。。。谢谢这是一个我严重忽视的简单错误,应该仔细检查一下!我已经更改了它,但当我在笔记本电脑上运行该程序时,仍然会出现分段错误。目前似乎无法通过ssh连接到Linux系统进行测试…将立即为closedir()编辑post,忘记在上次编辑中更新它。我一定会检查Char PrimePalthNo[ 512 ]用法,并考虑如何着手。谢谢。好的,我相信我已经正确地设置了使用动态分配,但是我仍然在没有打开子目录的线程上遇到错误。我将在稍后发布我的新代码。我不应该释放(文件路径名)吗?我想我必须这样做,才能正确地为递归调用malloc…1。在线程opendirectory()中释放它。2.如果是第1点,则也在main中执行动态alloc。3.不要忘记在其他分支上释放它,例如!ISDIR()和opendir()失败,等等。Hrm。。。也许只有我一个人,但在我没有空闲(filepathname)时,它似乎可以工作,而且在我的情况下,它可以在较小的目录上正常工作。。。谢谢你的帮助!
    pthread_mutex_t mutex;
    pthread_mutex_t dirlock;
    pthread_mutex_t filelock;
    pthread_mutex_t dircountlock;
    pthread_mutex_t threadlock;
    pthread_cond_t count_threshold_cv;
    pthread_attr_t attr;
    pthread_t threads[128]; // handles up to 128 threads (i.e. 128 directories, change accordingly)
    char directory[512];
    int dirSize = 0;
    int dirCount = 1; // user's input directory
    
    dpntr = opendir(t)
    
    if(closedir(t) < 0)
    
    if(closedir(dpntr) < 0)