The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Segmentation fault в fopen"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"Segmentation fault в fopen"  
Сообщение от rumkin (ok) on 28-Дек-08, 04:17 
Начинаю изучать Си и сразу попал в какую-то необъяснимо тупую ситуацию:
Пытаюсь читать файл, выдаёт segmentation fault при открытии файла.
компилю всё это дело так: gcc test.c -o test

#include <stdio.h>

int main(int argc, char *argv[]){
    printf("Content-Type: text/html; charset=utf-8\n\n");
    printf("hello world. Всем привет.\n");

    FILE *fp;
    fp = fopen("text.txt","r"); // <-- Segmentation Fault

    fclose(fp);

    return 0;
}}

P.S. Я полный нуб, не могу разобраться. ни найти, потому что не понимаю что искать. Кажется что дело в ограничении памяти, но почему и как это дело работает мне непонятно. ((

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Segmentation fault в fopen"  
Сообщение от angra (ok) on 28-Дек-08, 06:00 
Поздравляю, вы наткнулись на положенные всем начинающим грабли. Заучивайте два новых правила:
1. Всегда проверяйте результат вызова функций на возникновение ошибки
2. Перед использованием переменной, особенно указателя, убедитесь что она была должным образом инициализирована
Пример простой проверки:
if (fp) {
      fclose(fp);
    } else {
      printf("Ошибка открытия файла\n");
    }
В отладке программ вам могут пригодится strace и gdb
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Segmentation fault в fopen"  
Сообщение от rumkin (ok) on 29-Дек-08, 23:57 
Большое спасибо. А может segfault вылетать не при закрытии файла, а при открытии?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Segmentation fault в fopen"  
Сообщение от vic (??) on 30-Дек-08, 00:48 
>Большое спасибо. А может segfault вылетать не при закрытии файла, а при
>открытии?

в общем нет, читайте man fopen
там описаны все ошибки которые возвращает эта функция устанавливая возвращаемый указатель в NULL, ошибка в таком случае будет указана в переменной errno.

И еще, сразу отучайтесь считать что есть ошибка в системном вызове или в компиляторе, вероятность подобного 0.0000001%, и 99.9% что проблема в вашем коде.

ЗЫ если в fopen случится segfault, то вы скорее об этом узнаете обнаружив что все зависло или ядро напишет в консоль "паника, паника, паника" и убьется :)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "Segmentation fault в fopen"  
Сообщение от angra (ok) on 30-Дек-08, 00:58 
Маловероятно, если бы была ошибка в системном open, то ваша система вообще бы не загрузилась :)
Воспользуйтесь strace или gdb и увидите на каком именно моменте происходит вылет. Для примера я добавил printf("fopen done\n"); между fopen и fclose и запустил с strace:
open("text.txt", O_RDONLY)            = -1 ENOENT (No such file or directory)
write(1, "fopen done\n"..., 11fopen done
)         = 11
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
Как видим open отработал и вернул код ошибки, а вылет произошёл уже позже, когда пытались закрыть неинициализированный хендлер.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "Segmentation fault в fopen"  
Сообщение от Michelnok (??) on 30-Дек-08, 02:08 
>Большое спасибо. А может segfault вылетать не при закрытии файла, а при
>открытии?

Попробуйте передать в fopen мусор вместо указателя на имя файла.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Segmentation fault в fopen"  
Сообщение от Michelnok (??) on 29-Дек-08, 00:54 
> FILE *fp;
> fp = fopen("text.txt","r"); // <-- Segmentation Fault
>
> fclose(fp);

Валится скорее всего в fclose, а не в fopen.
fclose (как минимум, в FreeBSD) принципиально не проверяет аргумент на NULL, предпочитая свалиться в segmentation fault. Это имеет смысл, подобные баги (отсутствие проверки на успешное открытие файла в данном случае) проявлялись сразу. Как уже отметили, привыкайте проверять результат.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "Segmentation fault в fopen"  
Сообщение от vic (??) on 30-Дек-08, 03:23 
>Начинаю изучать Си
>компилю всё это дело так: gcc test.c -o test

советы для начинающих изучать С:
1. использовать опцию компилятора -Wall
2. изучить книгу создателей языка:
Автор: Брайен Керниган, Деннис Ричи
Название: Язык программирования Си

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру