Доступ к локальной переменной bash в c - PullRequest
1 голос
/ 16 мая 2019

Я пытаюсь переделать команду ls в C;Мне нужно реплицировать «итоговую» строку, если содержимое каталога указано (именно так, как это делает Unix ls).Я знаю, что это сумма размера файла (без учета мягкой ссылки и содержимого внутреннего каталога), округленная в большую сторону, разделенная на локальную переменную BLOCKSIZE, исправьте меня, если это не так.Вопросы: что такое BLOCKSIZE, как я могу проверить его с терминала и как получить его значение в c.PS: моя программа c должна быть запущена из bash, как ./program [options] {files}, я не могу передать что-либо еще в argv в main.Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 17 мая 2019

Посмотрите на POSIX statvfs() и <sys/statvfs.h>.Элемент, описанный как показано, звучит так, как вам нужно:

  • unsigned long f_bsize - Размер блока файловой системы

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

1 голос
/ 17 мая 2019

С GNU coreutils :

Размер блока по умолчанию выбирается путем последовательного изучения следующих переменных среды;первый из них определяет размер блока.
....
BLOCKSIZE

BLOCKSIZE - переменная среды.Вы получаете значение переменных среды, используя стандартный вызов C getenv().

 const char *blocksizestr = getenv("BLOCKSIZE");
 if (blocksizestr == NULL) { /* no BLOCKSIZE variable */ }
 int blocksize = atoi(blocksizestr);

Также обратите внимание, что BLOCKSIZE напрямую не влияет на ls.На него не ссылаются из coreutils / ls.c .LS_BLOCK_SIZE и BLOCK_SIZE являются.Переменная окружения BLOCKSIZE используется внутри библиотеки gnulib / human.c внутри функций human_options() и human_readable().human_readable() используется утилитами gnu для печати удобочитаемого вывода.

1 голос
/ 16 мая 2019

--block-size - это аргумент командной строки до ls:

man ls (1) :

--block-size=SIZE
с -l, размеры при печати SIZE при их печати; например., --block-size=M; см. РАЗМЕР формата ниже

...