LINUX.ORG.RU

Сообщения CraigB

 

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 ни на что не повлияет, просто нужно будет потом доделать программу до конца.):

pastebin.com/mvuaL7DV

 ,

CraigB
()

RTOS

Доброго времени суток. Хочу наконец-таки определиться в каком направлении программировать, и хотелось бы узнать про системы реального времени (qnx, vxworks, rtlinux, etc.). Востребованы ли сегодня специалисты в этой области? Если востребованы, вопросов побольше будет: какая из осрв наиболее популярна, где работают программисты осрв, ну и как оплачивается тоже хотелось бы узнать.

CraigB
()

RSS подписка на новые темы