Обход файловой системы в соответствии с заданным корневым местом с использованием потоков с использованием C для Unix - PullRequest
0 голосов
/ 05 марта 2011

Я хочу пройти через файловую систему, используя потоки и процессы. Моя программа должна предположить, что первый параметр задан как «-p», который предлагает многопроцессорное приложение, или «-t», который выполняется врезьбовой путь.Второй параметр - это путь к файлу или каталогу.Если моя программа получает путь к файлу, она должна распечатать размер файла в байтах.Если моя программа получает путь к каталогу, она должна таким же образом распечатать имя каталога, а затем обработать все записи в каталоге, кроме самого каталога и родительского каталога.Если моей программе присвоен каталог, она должна отображать всю иерархию с корнем в указанном каталоге.Я написал что-то, но я застрял в. Я не могу улучшить свой код. Пожалуйста, помогите мне.

Мой код выглядит следующим образом:

include

include

включают

включают

включают

включают

включают

int funcThread (DIR * D);

int main (int argc, char * argv []) {нить pthread_t [100];DIR * dirPointer;struct stat object_file;struct dirent * object_dir;int counter;

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

    }

}

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

}

Ответы [ 3 ]

1 голос
/ 05 марта 2011

Эта строка:

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

dirPointer является указателем DIR *, так как же он может быть равен литеральному строковому указателю?

0 голосов
/ 06 апреля 2019
if(ptr=readdir(dPtr)==NULL){}

Оператор = имеет более низкий приоритет, чем ==

[эта ошибка повторяется несколько раз]


0 голосов
/ 05 июня 2015

Я заметил несколько ошибок:

  1. Почему вы используете opendir () для проверки своих аргументов?Для этого вы должны использовать что-то вроде strcmp.

  2. Вы передаете struct dirent * в funcThread (), но funcThread () принимает DIR *.

  3. Вы используете oFile в funcThread () перед его инициализацией (вызывая stat ()).

  4. Какова цель вызова rewinddir ()?Я полагаю, вы слепо пытаетесь заставить readdir () работать с struct dirent *.

  5. Вы используете oDir, но он никогда не инициализируется.

  6. Вы вызываете printf () из нескольких потоков без возможности синхронизировать вывод, чтобы он был совершенно не в порядке или искажен.

Я предлагаю вам прочитать и понятьдокументирование всех этих функций перед их использованием (google "posix function_name") и ознакомление с основами C. И прежде чем приводить потоки в уравнение, попытайтесь заставить его работать в однопоточной программе.Кроме того, вы не увидите улучшения производительности при использовании такого количества потоков, если у вас нет такого количества ядер, это фактически снизит производительность и увеличит использование ресурсов.

...