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. изучить книгу создателей языка: Автор: Брайен Керниган, Деннис Ричи Название: Язык программирования Си
|