URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7803
[ Назад ]

Исходное сообщение
"Segmentation fault в fopen"

Отправлено rumkin , 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. Я полный нуб, не могу разобраться. ни найти, потому что не понимаю что искать. Кажется что дело в ограничении памяти, но почему и как это дело работает мне непонятно. ((


Содержание

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

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


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

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

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

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


"Segmentation fault в fopen"
Отправлено angra , 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 отработал и вернул код ошибки, а вылет произошёл уже позже, когда пытались закрыть неинициализированный хендлер.

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

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


"Segmentation fault в fopen"
Отправлено Michelnok , 29-Дек-08 00:54 
> FILE *fp;
> fp = fopen("text.txt","r"); // <-- Segmentation Fault
>
> fclose(fp);

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


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

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