Какая связь между индексным дескриптором и файлом?

Решать эту задачу казалось забавным; поскольку thrig охватывает параметр perl, вот сценарий bash, который делает нечто подобное. Он не выполняет достаточную проверку ошибок (предполагается, что вы передаете действительный PID команды сна). Он обрабатывает тот же синтаксис, что и GNU coreutils sleep , а именно:

  • суффиксы s | m | h | d для секунд / минут / часов / дней
  • несколько параметров времени складываются вместе

#!/usr/bin/env bash

# input: PID of a sleep command
# output: seconds left in the sleep command

function parse_it_like_its_sleep {
  # $1 = one sleep parameter
  # print out the seconds it translates to

  mult=1
  [[ $1 =~ ([0-9][0-9]*)(s|m|h|d) ]] && {
    n=${BASH_REMATCH[1]}
    suffix=${BASH_REMATCH[2]}
  } || {
    n=$1
  }
  case $suffix in
    # no change for 's'
    (m) mult=60;;
    (h) mult=$((60 * 60));;
    (d) mult=$((60 * 60 * 24));;
  esac
  printf %d $((n * mult))
}

# TODO - some sanity-checking for $1
set -- $(ps -o etimes=,args= $1)
[[ $2 = "sleep" ]] || exit 1
elapsed=$1
shift 2
total=0
for arg
do
  # TODO - sanity-check $arg
  s=$(parse_it_like_its_sleep $arg)
  total=$((total + s))
done
printf "%d seconds left\n" $((total - elapsed))

2
25.08.2018, 23:33
2 ответа

Индексный дескриптор — это файл, который идентифицируется исключительно своим номером индексного дескриптора.Имя файла — это просто метаданные в файловой системе, которые ссылаются на файл. Один файл/inode может иметь несколько имен файлов, ссылающихся на него :

.
$ touch foo
$ ln foo bar
$ ls -li foo bar
28098391 -rw-r--r--  2 xxxxxxx  xxxxx  0 Jul  6 22:15 bar
28098391 -rw-r--r--  2 xxxxxxx  xxxxx  0 Jul  6 22:15 foo

Первый столбец — это номер инода; обратите внимание, что это то же самое для обоих файлов. Первое число после разрешений — это количество ссылок; и foo, и barимеют счетчик ссылок, равный 2, поскольку каждое из двух имен относится к одному и тому же файлу.

$ rm foo
$ ls -li bar
28098391 -rw-r--r--  1 xxxxxxx  xxxxx  0 Jul  6 22:15 bar

rm fooудаляет только эту конкретную ссылку на базовый файл; barпо-прежнему ссылается на него (обратите внимание, что номер инода не изменился, но счетчик ссылок теперь равен 1 вместо 2 ). Также обратите внимание, что ни foo, ни barне были "настоящими" именами файла; тот факт, что fooбыл создан первым, никоим образом не делал его особенным. Файл фактически не удаляется до тех пор, пока все ссылки не будут удалены (, т. е. пока счетчик ссылок не уменьшится до 0 ). Даже в этом случае файл фактически не удаляется; блоки, выделенные для этого индекса, просто помечаются файловой системой как доступные для повторного использования.

5
27.01.2020, 21:53

Вот упрощенное объяснение обычного файла...

Люди используют имена файлов для ссылки на файлы. Ядро использует числа, называемые номерами инодов, для ссылки на файлы. Каталог — это сопоставление между именем файла и номером инода. Индексный дескриптор содержит метаданные, связанные с файлом, и указатель на первый блок данных файла. Первый блок данных содержит указатель на второй блок данных и так далее, пока не будет прочитан последний блок данных.

1
27.01.2020, 21:53

Теги

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