@fokin_nikolay1989

Как решить проблему с Segmentation fault?

Доброго времени суток!
Помогите разрешить проблему
#include <stdio.h>
#include <dirent.h>
#include <mntent.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>


int main() {
    FILE *mountsFile = setmntent("/proc/mounts", "r");
        DIR *dir;
    struct dirent *entry;
    struct stat file_stat;
    long long max_size = 0;
    char max_filename[256];


    struct mntent *mntEntry;
    while ((mntEntry = getmntent(mountsFile)) != NULL) {
        if (strcmp(mntEntry->mnt_type, "ext4") == 0) {
            printf("Device: %s\n", mntEntry->mnt_fsname);
            printf("Mount Point: %s\n\n", mntEntry->mnt_dir);

        dir = opendir(mntEntry->mnt_dir);
        if (dir == NULL) {
        perror("Ошибка открытия директории");
        return -1;
        }
        while ((entry = readdir(dir)) != NULL) {
        char filename[256];
        strcpy(filename, "mntEntry->mnt_dir"); // должен стоять символ "/" в конце пути, не пойму как добавить
        strcat(filename, entry->d_name);

        if (stat(filename, &file_stat) == -1) {
            perror("Ошибка выполнения stat для файла");
            closedir(dir);
            return -1;
        }

        if (S_ISREG(file_stat.st_mode) && file_stat.st_size > max_size) {
            max_size = file_stat.st_size;
            strcpy(max_filename, filename);
        }

        }
        }
        }
        printf("Самый большой файл: %s, размер: %lld байт\n", max_filename, max_size);
    endmntent(mountsFile);
        closedir(dir);

    return 0;
}


]# g++ allfind.cpp -o all
]# ./all

Device: /dev/sdb1
Mount Point: /opt/disk

Ошибка выполнения stat для файла: No such file or directory
  • Вопрос задан
  • 209 просмотров
Решения вопроса 1
@res2001
Developer, ex-admin
Ошибка выполнения stat для файла: No such file or directory

Потому что:
strcpy(filename, "mntEntry->mnt_dir");
Вы записываете в filename строку "mntEntry->mnt_dir", а не каталог.
Добавить затем слэш в конец можно так: strcat(filename, "/");
Или вручную:
size_t len = strlen(filename);
filename[len] = '/';
filename[len + 1] = '\0';

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

Есть еще момент. В линукс есть константа PATH_MAX она задает максимальный размер пути к файлу. Рекомендую ваши буфера для хранения путей делать размером PATH_MAX.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы