Как я могу сказать, если утечка памяти находится в пространстве пользовательского пространства или пространства для ядра?

Также есть:

mkdir '
';    dir=$(basename ./'
');   echo "${#dir}"

0

Такие странные вещи случаются, потому что есть много интерпретации и синтаксического анализа, а остальное должно происходить, когда два процесса взаимодействуют. Подстановки команд удаляют завершающие символы новой строки. И NUL (хотя, очевидно, здесь это не имеет значения) . basename и dirname также удаляют завершающие символы новой строки в любом случае, потому что как еще вы с ними разговариваете? Я знаю, что завершающие символы новой строки в имени файла в любом случае являются анафемой, но вы никогда не узнаете. И нет смысла идти по пути, который может быть ошибочным, если можно было поступить иначе.

Тем не менее ... $ {pathname ## * /}! = Basename и аналогично $ {pathname% / *}! = Dirname . Эти команды предназначены для выполнения в основном четко определенной последовательности шагов для достижения указанных результатов.

Спецификация приведена ниже, но сначала краткая версия:

basename()
    case   $1   in
    (*[!/]*/)     basename         "${1%"${1##*[!/]}"}"   ${2+"$2"}  ;;
    (*/[!/]*)     basename         "${1##*/}"             ${2+"$2"}  ;;
  (${2:+?*}"$2")  printf  %s%b\\n  "${1%"$2"}"       "${1:+\n\c}."   ;;
    (*)           printf  %s%c\\n  "${1##///*}"      "${1#${1#///}}" ;;
    esac

Это полностью POSIX-совместимое базовое имя в простом sh . Сделать это несложно. Я объединил пару веток, которые использую ниже, потому что это не повлияло на результаты.

Вот спецификация:

basename()
    case   $1 in
    ("")            #  1. If  string  is  a null string, it is 
                    #     unspecified whether the resulting string
                    #     is '.' or a null string. In either case,
                    #     skip steps 2 through 6.
                  echo .
     ;;             #     I feel like I should flip a coin or something.
    (//)            #  2. If string is "//", it is implementation-
                    #     defined whether steps 3 to 6 are skipped or
                    #     or processed.
                    #     Great. What should I do then?
                  echo //
     ;;             #     I guess it's *my* implementation after all.
    (*[!/]*/)       #  3. If string consists entirely of <slash> 
                    #     characters, string shall be set to a sin‐
                    #     gle <slash> character. In this case, skip
                    #     steps 4 to 6.
                    #  4. If there are any trailing <slash> characters
                    #     in string, they shall be removed.
                  basename "${1%"${1##*[!/]}"}" ${2+"$2"}  
      ;;            #     Fair enough, I guess.
     (*/)         echo /
      ;;            #     For step three.
     (*/*)          #  5. If there are any <slash> characters remaining
                    #     in string, the prefix of string up to and 
                    #     including the last <slash> character in
                    #     string shall be removed.
                  basename "${1##*/}" ${2+"$2"}
      ;;            #      == ${pathname##*/}
     ("$2"|\
      "${1%"$2"}")  #  6. If  the  suffix operand is present, is not
                    #     identical to the characters remaining
                    #     in string, and is identical to a suffix of
                    #     the characters remaining  in  string, the
                    #     the  suffix suffix shall be removed from
                    #     string.  Otherwise, string is not modi‐
                    #     fied by this step. It shall not be
                    #     considered an error if suffix is not 
                    #     found in string.
                  printf  %s\\n "$1"
     ;;             #     So far so good for parameter substitution.
     (*)          printf  %s\\n "${1%"$2"}"
     esac           #     I probably won't do dirname.

... может быть, комментарии отвлекают ....

4
13.10.2018, 23:14
1 ответ

Выполняет ли приложение какое-либо анонимное выделение памяти через mmap ()?
Какие-либо файлы данных или журналов записываются на RAM-диск? Есть темы, которые постоянно начинаются и заканчиваются? Правильно обрабатывать завершение потока? (Был там, нашел, что как утечка. )Если вы немного подождете, уменьшится ли использование памяти ядром по мере освобождения динамических структур?

Я бы оценил вероятность утечки памяти выше 99% в пользу приложения.

1
27.01.2020, 21:01

Теги

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