我想通过使用线程和进程遍历文件系统 . 我的程序必须假设第一个参数是“-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 回答
我发现了一些错误:
为什么使用opendir()检查你的参数?你应该使用像strcmp这样的东西 .
您将struct dirent *传递给funcThread()但funcThread()接受DIR * .
在初始化之前,你在funcThread()上使用oFile(通过调用stat()) .
调用rewinddir()的目的是什么?我猜你是盲目地试图让readdir()使用struct dirent * .
您正在使用oDir,但它从未初始化 .
您正在从多个线程调用printf(),无法同步输出,因此它将完全无序或出现乱码 .
我建议你在使用它们之前阅读并理解所有这些函数的文档(google“posix function_name”)并熟悉C的基础知识 . 在将线程引入等式之前,尝试让它在单线程程序上运行 . 此外,除非您接近那么多内核,否则您将看不到使用那么多线程的性能改进,它实际上会降低性能并增加资源使用 .
这一行:
dirPointer是一个指针DIR *所以它怎么能等于文字字符串指针?