Является ли системный вызов процессом?

В zshвы можете сделать что-то вроде:

autoload zcalc
accept-line() {
  if [[ $BUFFER =~ '^[ (]*[+-]? *(0[xX]|.)?[[:digit:]]+[^[:alnum:]]' ]]; then
    echo
    zcalc -e $BUFFER
    print -rs -- $BUFFER
    BUFFER=
  fi
  zle.$WIDGET
}
zle -N accept-line

Он переопределяет виджет accept-line(, сопоставленный с Введите)в пользовательский -виджет, который проверяет, начинается ли текущая строка с числа (десятичного или шестнадцатеричного )опционально с префиксом любого количества (s, ища после этого не -alnum символ, чтобы избежать ложных срабатываний для таких команд, как 7zipили 411toppm.

Если это совпадает, мы передаем его вzcalc(более полезное, чем bc, поскольку оно может использовать переменные оболочки и все математические функции zsh и числовые стили, но не поддерживает произвольную точность ), добавьте строку в историю и принять пустую команду.

Учтите, что это может привести к путанице, если вы введете строку с цифрами в таких вещах, как:

cat << EOF
213 whatever
EOF

Или:

var=(
  123 456
)
0
07.02.2020, 09:39
2 ответа

Процесс может сделать системный вызов. Первоначально на машине x86 это включало загрузку регистров, чтобы указать, какой вызов требуется, а затем выполнение инструкции «int 0x80». Эта инструкция программного прерывания заставляла процессор x86 переключаться на ядро, где он просматривал значение в регистрах, а затем продолжал выполнять открытие, чтение, запись, закрытие, поиск или любой другой желаемый системный вызов.

Спрашивать, является ли системный вызов процессом, все равно, что спрашивать, является ли птица планом путешествия или нет? Ответ: , а не . Вы можете планировать свое путешествие, чтобы увидеть птицу. Чтобы сделать что-то полезное, процесс будет выполнять системные вызовы (. Теоретически другой процесс может отслеживать разделяемую память или использовать ptrace, поэтому процессу не нужно выполнять системные вызовы, 100%-го ответа никогда не бывает ). но они далеко не одно и то же.

3
28.04.2021, 23:24

Процесс — это работающий экземпляр некоторого кода. Возьмем пример двоичного файла /bin/bash. Код существует на диске. Каждый раз, когда вы выполняете /bin/bash, создается новый процесс.

В данный момент каждый процессор работает либо в режиме пользователя, либо в режиме ядра. Режим пользователя указывает на выполнение кода пользовательского пространства, режим ядра — на выполнение кода ядра.

Системный вызов — это средство для некоторого пользовательского кода войти в режим ядра. Системные вызовы выполняются в контексте процесса. Когда выполняется системный вызов, тот же процесс переходит в режим ядра. Для запуска этого системного вызова не создается новый процесс.

2
28.04.2021, 23:24

Теги

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