Ошибка сегментации (ядро сброшено) с использованием stat (st_uid) - PullRequest
0 голосов
/ 18 ноября 2018

Я хотел бы написать простой сценарий C в UNIX, который будет работать как "ls -l".У меня есть рабочая часть, где скрипт перечисляет все файлы в текущем каталоге:

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>

int main(int argc, char *argv[])
{
 DIR *katalog;
 struct dirent *dir;
 katalog = opendir(".");

if (argc == 1) {
printf("without option");
  if (katalog) {
    while ((dir = readdir(katalog)) {
     printf("%s \n", dir->d_name);
    }
    closedir(katalog);
  }
  return(0);
}    
}

Теперь я хотел добавить информацию о st_gid, st_uid, st_size и st_mtime.Я смотрел с st_uid.Мой код теперь выглядит так (он хорошо компилируется под Unix).К сожалению, выдает ошибку «Ошибка сегментации (ядро сброшено)».Я пытался найти ответ в стеке и в Интернете и даже использовал некоторые подсказки из других потоков (например: проблема формата C с printf ("% d", astatbuff-> st_size); ), но все же ошибка возникает ... Я не знаю, что еще я могу изменить, чтобы исправить это ...

Вот код, который выдает ошибку:

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h> 

int main(int argc, char *argv[])
{
 DIR *katalog;
 struct dirent *dir;
 katalog = opendir(".");
 struct stat *astat;

if (argc == 1) {
printf("Without option");
  if (katalog) {
    while ((dir = readdir(katalog)) != NULL && astat->st_uid != 0) {
     printf("%s %llu \n", dir->d_name, (unsigned long long)astat->st_uid);
    }
    closedir(katalog);
  }
  return(0);
}
}

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Поскольку astat еще не инициализирован / не назначен до astat->st_uid, код демонстрирует неопределенное поведение (UB). В случае OP код потерпел крах,

Вместо того, чтобы объявлять указатель без значения, используйте код nneds для:

1) Объявить объект struct stat.

2) Заполнил его вызовом *stat(). исх .

int main(int argc, char *argv[]) {
  DIR *katalog;
  struct dirent *dir;
  katalog = opendir(".");

  //struct stat *astat;

  if (argc == 1) {
    printf("Without option");
    if (katalog) {
      while ((dir = readdir(katalog)) != NULL) {
        // add
        struct stat sb;
        if (lstat(dir->d_name, &sb) == -1) {
          perror("lstat");
          exit(EXIT_FAILURE);
        }
        if (sb.st_uid != 0) {
          printf("%s %llu \n", dir->d_name, (unsigned long long) sb.st_uid);
        }
      }
      closedir(katalog);
    }
  }
  return (0);
}
0 голосов
/ 18 ноября 2018

astat не инициализируется в вашем коде (используйте в цикле while)

...