The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
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, 06:00 , 28-Дек-08 (1)
    Поздравляю, вы наткнулись на положенные всем начинающим грабли. Заучивайте два новых правила:
    1. Всегда проверяйте результат вызова функций на возникновение ошибки
    2. Перед использованием переменной, особенно указателя, убедитесь что она была должным образом инициализирована
    Пример простой проверки:
    if (fp) {
          fclose(fp);
        } else {
          printf("Ошибка открытия файла\n");
        }
    В отладке программ вам могут пригодится strace и gdb
    • Segmentation fault в fopen, !*! rumkin, 23:57 , 29-Дек-08 (3)
      Большое спасибо. А может segfault вылетать не при закрытии файла, а при открытии?

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

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

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

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

      • Segmentation fault в fopen, !*! angra, 00:58 , 30-Дек-08 (5)
        Маловероятно, если бы была ошибка в системном 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, 02:08 , 30-Дек-08 (6)
        >Большое спасибо. А может segfault вылетать не при закрытии файла, а при
        >открытии?

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

  • Segmentation fault в fopen, !*! Michelnok, 00:54 , 29-Дек-08 (2)
    > FILE *fp;
    > fp = fopen("text.txt","r"); // <-- Segmentation Fault
    >
    > fclose(fp);

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

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

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




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

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