Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка сегментирования 
:(
    Опции темы
Xonxt
Дата 21.11.2007, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 24.1.2006
Где: Украина / Одесса

Репутация: нет
Всего: 1



Здрасьте smile

Пишу небольшую программу. Она должна получить из командной строки имя файла либо папки и в первом случае прост овывести его параметры, а во твтором: отобразить нечто похожее на дерево каталогов.

Код:
Код

#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <unistd.h>
#include <time.h>

void attributs(struct stat f_st,char *f_name)
{    
    printf("%s\t\t\t%d\n",f_name, f_st.st_size);    
    return;
}
    
void directory(char *f_dir_name)
{    
    struct stat f_dir_st;
    struct dirent *f_directp;
    DIR *f_dirp;
    
    int f_status;
    stat(f_dir_name,&f_dir_st);
    attributs(f_dir_st,f_dir_name);
    
    f_dirp = opendir(f_dir_name);
    f_directp = readdir(f_dirp);
    
    while(f_directp = readdir(f_dirp))
    {
        chdir(f_dir_name);
        stat(f_directp->d_name,&f_dir_st);
        
        if(S_ISREG(f_dir_st.st_mode))
        {
            attributs(f_dir_st,f_directp->d_name);
        }
        else if(S_ISDIR(f_dir_st.st_mode))
        { 
            chdir(f_directp->d_name);
            directory(f_directp->d_name);
            chdir("./..");
        }
    }
    return;
}
    
int main(int argc,char *argv[])
{
    struct stat st;
    struct dirent *directp;
    DIR *dirp;
    int status;
    
    printf("Name\t\t\tSize\n");
    
    if(argc!=2)
    {
        printf("Ошибка передачи параметров\n");
        _exit(1);
    }
    
    if(stat(argv[1],&st)!=0)
    {
        printf("Ошибка! Такого файла не существует\n");
        _exit(1);
    }
    
    if(S_ISREG(st.st_mode))
    {
        attributs(st,argv[1]);        
        _exit(0);
    }
    else if (S_ISDIR(st.st_mode))
    { 
        chdir(argv[1]);
        directory(argv[1]); 
    }
    _exit(0);
}


При первой же попытке программы зайти в какую либо папку, выдается "ошибка сегментирования".

Где я ошибся? Заранее спасибо.
PM MAIL ICQ Skype   Вверх
MAKCim
Дата 21.11.2007, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Код

#include <fcntl.h>
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <unistd.h>
#include <time.h>
void attributs(struct stat f_st,char *f_name)
{    
    printf("%s\t\t\t%d\n",f_name, f_st.st_size);    
    return;
}
    
void directory(char *f_dir_name)
{    
    struct stat f_dir_st;
    struct dirent *f_directp;
    DIR *f_dirp;
    int f_status;
    strcpy(name, f_dir_name);
    stat(name,&f_dir_st);
    attributs(f_dir_st,name);
    
    if ((f_dirp = opendir(name)) == NULL)
        return 0;
    chdir(name);
    
    while(f_directp = readdir(f_dirp))
    {
        if (!strcmp(f_directp -> d_name, ".") || !strcmp(f_directp -> d_name, ".."))
            continue;
        stat(f_directp->d_name,&f_dir_st);
        
        if(S_ISREG(f_dir_st.st_mode))
        {
            attributs(f_dir_st,f_directp->d_name);
        }
        else if(S_ISDIR(f_dir_st.st_mode))
        { 
            directory(f_directp->d_name);
        }
    }
    closedir(f_dirp);
    chdir("..");
}
    
int main(int argc,char *argv[])
{
    struct stat st;
    struct dirent *directp;
    DIR *dirp;
    int status;
    
    printf("Name\t\t\tSize\n");
    
    if(argc!=2)
    {
        printf("Ошибка передачи параметров\n");
        _exit(1);
    }
    
    if(stat(argv[1],&st)!=0)
    {
        printf("Ошибка! Такого файла не существует\n");
        _exit(1);
    }
    
    if(S_ISREG(st.st_mode))
    {
        attributs(st,argv[1]);        
        _exit(0);
    }
    else if (S_ISDIR(st.st_mode))
    { 
        directory(argv[1]); 
    }
    _exit(0);
}

совет на будущее
делай проверки после вызова библиотечных функций  smile 

Это сообщение отредактировал(а) MAKCim - 22.11.2007, 00:50


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Xonxt
Дата 21.11.2007, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 24.1.2006
Где: Украина / Одесса

Репутация: нет
Всего: 1



Ув. MAKCim, Ваше внесение исправлений в код к решению проблемы с ошибкой сегментирования не привело. Думаем дальше..

Методом брутфорсного тестирования удалось выяснить, что при таком, к примеру, дереве каталогов:

Код

/root/
----/root/dir1/
--------/root/dir1/dir4/
--------/root/dir1/dir5/
------------/root/dir1/dir5/dir6
------------/root/dir1/dir5/dir7
--------/root/dir1/dir8/
----/root/dir2/
--------/root/dir2/dir9/
--------/root/dir2/dir10/
----/root/dir3/

ошибка появляется сразу же после 25 строки
Код
f_dirp = opendir(f_dir_name);


Ребят, неужели никаких соображений?(
Это нужно уже на завтра :(

Это сообщение отредактировал(а) Xonxt - 21.11.2007, 22:45
PM MAIL ICQ Skype   Вверх
MAKCim
Дата 21.11.2007, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Xonxt, 
да не может быть
проверь еще раз
ты код правильно скопировал?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Xonxt
Дата 21.11.2007, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 24.1.2006
Где: Украина / Одесса

Репутация: нет
Всего: 1



Обижаешь...

Программа работает отлично, если в рассматриваемой папке нет других папок, а только файлы. А если есть другие папки (как в примере дерева каталогов в моём предыдущем сообщении), то на них вылетает ошибка.

Либо дело в разных операционках. У меня вот Suse 10.2

Добавлено через 5 минут и 48 секунд
Гм.. пардон.
Скопировал код еще раз - заработало.

Дивны дела твои, Юникс (( Спасибо большое smile

Это сообщение отредактировал(а) Xonxt - 21.11.2007, 22:57
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0457 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.