Как избежать ошибки сегментации при открытии файла в цикле? - PullRequest
1 голос
/ 07 марта 2019

При попытке открыть файл (определяется событием-> имя), я постоянно получаю ошибку сегментации (ядро сброшено). Самое близкое, что мне нужно для предотвращения этой проблемы, это изменив «rb» на «r» и удалив функцию хеширования под ней - включая «fclose (ftest)» - однако я бы не стал рассматривать этот прогресс ...

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
#include <sys/inotify.h>
#include <openssl/sha.h>

int main (int argc, char *argv[])
{
        int fd;
        int wd;
        unsigned char c[SHA512_DIGEST_LENGTH];
        int i;
        SHA512_CTX mdContext;
        int bytes;
        unsigned char data[1024];
        const int event_size = sizeof(struct inotify_event);
        const int buf_len = 1024 * (event_size + FILENAME_MAX);
        FILE *ftest;

        fd = inotify_init();

        if (fd < 0) {
          perror("inotify_init");
        }

        wd = inotify_add_watch(fd, "/home/joe/Documents", IN_CREATE);

        while (1) {
          char buff[buf_len];
          int no_of_events, count = 0;

          no_of_events = read (fd, buff, buf_len);
          while (count < no_of_events) {
            struct inotify_event *event = (struct inotify_event *)&buff[count];
            if (event->len) {
              if (event->mask & IN_CREATE)
              if(!(event->mask & IN_ISDIR)) {
                printf("The file %s has been created\n", event->name);

                ftest=fopen(event->name, "rb");  //segmentation fault 
                                                 //occurs here
                SHA512_Init (&mdContext);        
                while ((bytes = fread (data, 1, 1024, ftest)) != 0)
                    SHA512_Update (&mdContext, data, bytes);
                SHA512_Final (c,&mdContext);
                for(i = 0; i < SHA512_DIGEST_LENGTH; i++) printf("%02x", c[i]);
                printf (" %s\n", ftest);
                fclose (ftest);
                fflush(stdout);
              }
            }
            count += event_size + event->len;
          }
        }
        return 0;
}

Пройдя через Valgrind, он не предоставляет подробных сведений об ошибках до ошибки сегментации, а после возникновения ошибки не предоставляет подробностей после этого.

1 Ответ

3 голосов
/ 07 марта 2019

Ваша проблема в том, что вы не проверяете никаких возвращаемых значений.Каждый вызов функции, который возвращает что-то, должен быть проверен и обработан.В частности, вы не проверяете возвращаемое значение этого:

ftest=fopen(event->name, "rb");  //segmentation fault 

, если оно возвращает ноль (например, потому что event->name содержит имя файла, а не полный путь и вы не работаете в каталоге, который вы отслеживаете),вы получите сообщение об ошибке.

Вы также не проверяете этот

wd = inotify_add_watch(fd, "/home/joe/Documents", IN_CREATE);

и, возможно, другие.

Другая проблема заключается в том, что вы печатаете дескриптор файла в виде строки.здесь:

printf (" %s\n", ftest);

Также, чтобы получить полезную информацию в отладчике и в valgrind, вам нужно собрать с отладочной информацией (gcc -g)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...