Я делаю свою домашнюю работу, что мне нужно сделать, это подсчитать каталоги и файлы данного каталога, но каждый каталог, который я обнаружил, должен быть посчитан так же с другим потоком моего процесса, это то, что я до сих пор:
void *dirCounter(void *param){
queue<pthread_t> queue;
dir_ptr dir = (dir_ptr)param;
dir->countDir = 0;
DIR* dirName = dir->name;
struct dirent *curr;
off_t dsp;
dsp= telldir(dirName);
while(dsp!= -1){
curr = readdir(dirName);
if(curr == NULL){
break;
}
if(!strcmp(curr->d_name,".")|!strcmp(curr->d_name,"..")) { //To avoid counting . and ..
dsp = telldir(dirName); //Actual position asociated to the stream
continue; //Executes the beginning of the while
}
if(curr->d_type == DT_DIR){
dir->countDir++; //counts directories in the first level
//For each directory found, create another thread and add it to the queue:
pthread_attr_t attr1;
pthread_t tid1;
pthread_attr_init(&attr1);
dir_ptr par1 = (dir_ptr)malloc(sizeof(directorio));
par1->name = opendir(curr->d_name);
par1->countDir = par1->countFile = 0;
pthread_create(&tid1,&attr1, dirCounter, par1);
//queue.push(tid1);
}
if(curr->d_type == DT_REG){
dir->countFile++; //Counts files
}
dsp = telldir(dirName);
}
//pthread_join(tid1, NULL);
//while(!queue.empty()){
//pthread_join(queue.front(), NULL);
// queue.pop();
//}
printf("Dirs: %d Files: %d\n", dir->countDir, dir->countFile);
pthread_exit(NULL);
}
Пока код действительно считает текущие файлы и каталоги «первого уровня», если объединение закомментировано, а затем просто выдает ошибку сегментации, если строка не закомментирована, это дает простовыходная линия, а затем умирает с ошибкой сегментации.Идея заключалась в том, чтобы создать поток всякий раз, когда я нашел каталог, а затем соединить его в конце, создавая полурекурсивную процедуру.
Модификации:
char str[256];
strcpy(str, "./");
strcat(str, curr->d_name);
//strcat(str, "\"");
puts(str);
par1->name = opendir(str);
par1->countDir = par1->countFile = 0;
pthread_create(&tid1,&attr1, dirCounter, par1);
queue.push(tid1);
Что он делает после модификации: Печатает ВСЕ каталоги, однако это вызывает ошибку сегментации, и некоторые потоки не завершают свою задачу.