【问题标题】:Traversing file system according to a given root place by using threads by using C for unix通过使用 C for unix 使用线程根据给定的根位置遍历文件系统
【发布时间】:2011-07-09 13:07:19
【问题描述】:

我想通过使用线程和进程来遍历文件系统。我的程序必须假设第一个参数是提供多进程应用程序的“-p”或在多进程应用程序中运行的“-t”螺纹方式。第二个参数是 文件或目录的路径名。如果我的程序获取文件的路径,它应该以字节为单位打印出文件的大小。如果我的程序得到一个目录的路径,它应该以同样的方式打印出目录名,然后处理目录中的所有条目 目录本身和父目录除外。如果给我的程序一个目录,它必须显示以指定目录为根的整个层次结构。我写了一些东西,但我卡住了。我无法改进我的代码。请帮助我。

我的代码如下:

包括

包括

包括

包括

包括

包括

包括

int funcThread(DIR *D);

int main(int argc, char * argv[]) { pthread_t 线程[100]; 目录 *dirPointer; 结构统计对象文件; 结构 dirent *object_dir; 整数计数器;

    if(opendir(argv[1])==NULL)
{
    printf("\n\nERROR !\n\n Please enter -p or -t \n\n");
    return 0;
}

if((dirPointer=opendir(argv[1]))=="-t") 
{
    if ((object_dir = opendir(argv[2])) == NULL) 
        {
                printf("\n\nERROR !\n\nPlease enter the third argument\n\n");
                return 0;.
        }
    else
    {   
        counter=0;
        while ((object_dir = readdir(object_dir)) != NULL)
        {
            pthread_create(&thread[counter],NULL,funcThread,(void *) object_dir);
            counter++;
        }

    }

}

返回 0; }

int funcThread(DIR *dPtr) { 目录 *ptr; 结构统计oFile; 结构 dirent *oDir; 整数;

if(ptr=readdir(dPtr)==NULL)
    rewinddir(ptr); 

if(S_ISDIR(oFile.st_mode)) 
{
    ptr=readdir(dPtr);
    printf("\t%s\n",ptr);
    return funcThread(ptr);
}
else
{
    while(ptr=readdir(dPtr)!=NULL) 
    {
        printf("\n%s\n",oDir->d_name);
        stat(oDir->d_name,&oFile);
        printf("\n%f\n",oFile.st_size);
    }
    rewinddir(ptr); 
}

}

【问题讨论】:

    标签: c multithreading unix multiprocessing


    【解决方案1】:

    这一行:

    if((dirPointer=opendir(argv[1]))=="-t") 
    

    dirPointer 是一个指针 DIR* 那么它怎么能等于一个字面字符串指针呢?

    【讨论】:

      【解决方案2】:

      我发现了一些错误:

      1. 为什么要使用 opendir() 检查参数?你应该使用类似 strcmp 的东西。

      2. 您将 struct dirent* 传递给 funcThread() 但 funcThread() 需要一个 DIR*。

      3. 在初始化之前,您在 funcThread() 上使用 oFile(通过调用 stat())。

      4. 调用 rewinddir() 的目的是什么?我猜你是在盲目地试图让 readdir() 与 struct dirent* 一起工作。

      5. 您正在使用 oDir,但它从未初始化。

      6. 您正在从多个线程调用 printf(),而无法同步输出,因此它会完全无序或乱码。

      我建议您在使用之前阅读并理解所有这些函数的文档(谷歌“posix function_name”)并熟悉 C 的基础知识。在将线程引入方程式之前,请尝试使其在单线程上工作程序。此外,除非您拥有接近那么多的内核,否则您不会看到使用那么多线程来提高性能,这实际上会降低性能并增加资源使用率。

      【讨论】:

        【解决方案3】:
        if(ptr=readdir(dPtr)==NULL){}
        

        = 运算符的优先级低于==

        [这个错误重复了好几次]


        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-19
          • 1970-01-01
          • 1970-01-01
          • 2014-01-17
          • 2010-12-14
          相关资源
          最近更新 更多