fork(), wait()
Всем привет!
Помогите разобраться в чем ошибка. Принцип программы прост: пройти по всем подкаталогам заданного каталога(argv[1]) и вывести путь до каждого файла. Но путь до файла должен выводить отдельный процесс. Главный процесс запускает функцию SearchFile, для вывода пути к файлу, ГЛАВНЫЙ процесс порождает дочерний, и тот в свою очередь выводит путь. Колличество дочерних не должно превышать N(argv[3]).
Вот функция SearchFile:
void SearchFile(char *catalog_name, char *argv[], FILE *file_proc)
{
DIR *current_catalog;
struct dirent *current_element;
char *current_way = NULL;
int proc_count = atoi(argv[3]);
pid_t pid;
errno = 0;
if(strcmp(catalog_name, "/proc") != 0) {
/*if the directory can be opened*/
if (current_catalog = opendir(catalog_name)) {
while(TRUE) {
current_element = readdir(current_catalog);
if (current_element)
if ((strcmp(current_element->d_name,"..") != 0) && (strcmp(current_element->d_name,".") != 0)) {
/*Add new element`s name to the path*/
current_way = EditAdress(catalog_name, current_element->d_name);
if (current_element->d_type == 4)
SearchFile(current_way, argv, file_proc);
else
if (current_element->d_type == 8) {
state = TRUE;
if (pr_c < proc_count)
pr_c++;
else {
wait();
pr_c--;
}
pr_c++;
//current_way = EditAdress(catalog_name, current_element->d_name);
pid = fork();
if (pid == 0) {
//sleep(1);
printf("%s\n", current_way); //sleep(10);
exit(0);
}
//current_way = EditAdress(catalog_name, current_element->d_name);
success = TRUE;
}
}
/*if the error, when openenig file, occured - pass it*/
if (errno) {
fprintf(stderr, "%s: %s: %s\n", argv[0], current_way, strerror(errno));
errno = 0;
}
/*leave when reached catalog`s end*/
else
if (current_element == NULL)
break;
}
if (closedir(current_catalog) == -1)
fprintf(stderr, "%s: %s: Couldn`t close catalog\n", argv[0], catalog_name);
}
else
fprintf(stderr, "%s: %s: Couldn`t open catalog\n", argv[0], catalog_name);
}
}
Функция SearchFile (присоединяет название нового каталога к пути до текущего каталога):
char *EditAdress(char *catalog_name, char *file_name)
{
char *current_way = NULL;
current_way = (char *) malloc(strlen(catalog_name) + strlen(file_name) + 2);//2
strcpy(current_way, catalog_name);
if(strlen(catalog_name) != 1)
current_way[strlen(catalog_name)] = '/';
current_way[strlen(catalog_name) + 1] = '\0';
strcat(current_way, file_name);
return current_way;
}
Теперь вопрос: почему после того как выполняется wait(), в current_way удаляются последние символы, и после нескольких прочитанных файлов, возникает Error: malloc(): memory corruption?
Пробовал в функции EditAdress выделять больше памяти (т.е не +2, а +10 к примеру), тогда ошибка с malloc() не возникает, но все равно в current_way удаляются последние символы. Если не создавать дочерние процессы, то все работает правильно, даже когда выделяю +2 элемента.
Вот на всякий случай весь код( пример вызова программы: ./prog /usr f 4, f ни на что не повлияет, просто нужно будет потом доделать программу до конца.):