Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C for unix使用线程根据给定根位置遍历文件系统_C_Multithreading_Unix_Multiprocessing - Fatal编程技术网

使用C for unix使用线程根据给定根位置遍历文件系统

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

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

我的代码如下:

包括 包括 包括 包括 包括 包括 包括 int funcThread(DIR*D)

int main(int argc,char*argv[]) { pthread_t thread[100]; DIR*dirPointer; 结构统计对象_文件; 结构方向*对象方向; 整数计数器

    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; 结构统计文件; 结构方向*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); 
}
}这一行:

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

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

我发现了一些错误:

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

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

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

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

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

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

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

    if(ptr=readdir(dPtr)==NULL){}
    

    =
    运算符的优先级低于
    =

    [此错误重复几次]