首页 文章

通过使用C作为unix,使用线程根据给定的根位置遍历文件系统

提问于
浏览
0

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

我的代码如下:

包括

包括

包括

包括

包括

包括

包括

int funcThread(DIR * D);

int main(int argc,char * argv []){pthread_t thread [100]; DIR * dirPointer; struct stat object_file; struct 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){DIR * ptr; struct stat oFile; struct dirent * oDir; int num;

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); 
}

}

2 回答

  • 0

    我发现了一些错误:

    • 为什么使用opendir()检查你的参数?你应该使用像strcmp这样的东西 .

    • 您将struct dirent *传递给funcThread()但funcThread()接受DIR * .

    • 在初始化之前,你在funcThread()上使用oFile(通过调用stat()) .

    • 调用rewinddir()的目的是什么?我猜你是盲目地试图让readdir()使用struct dirent * .

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

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

    我建议你在使用它们之前阅读并理解所有这些函数的文档(google“posix function_name”)并熟悉C的基础知识 . 在将线程引入等式之前,尝试让它在单线程程序上运行 . 此外,除非您接近那么多内核,否则您将看不到使用那么多线程的性能改进,它实际上会降低性能并增加资源使用 .

  • 1

    这一行:

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

    dirPointer是一个指针DIR *所以它怎么能等于文字字符串指针?

相关问题