Если ядро ​​может засыпать при обработке системного вызова, как выполнение возвращается к системному вызову?

Вы можете помочь в отладке expect, добавив опцию -d. В вашем примере вы увидите, что вы делаете "...send "\r"...", который оценивается оболочкой как ...send r..., потому что \rсам по себе вне двойных кавычек. Попробуйте изменить это на send \"\r\", как и в других случаях. Вам также нужно поставить аналогичный возврат каретки -в конце каждой отправки:send \"root\r\".

Было бы чище написать небольшой файл сценария оболочки или использовать одинарные кавычки, преобразуя их в двойные для ${1:-0}, которые нуждаются в интерполяции:

expect -c 'spawn screen /dev/ttyS'"${1:-0} ${2:-115200}"'; send \r; expect " login: ";...'

Этот полный скрипт (без использования оболочки )также имеет дело с уже зарегистрированным случаем:

#!/bin/expect --
set tty 0
set baud 115200
if { $argc >= 1 } {
 set tty [lindex $argv 0]
}
if { $argc >= 2 } {
 set baud [lindex $argv 1]
}
spawn screen /dev/ttyS$tty $baud
send \r
expect {
      "login: " {
           send root\r
           expect "Password: "
           send root\r
       }
       "#" 
    }
interact
1
04.09.2019, 15:09
1 ответ

Ключевая часть здесь:

user processes cannot execute in kernel space

Это неверно. Когда Роберт Лав пишет, что системный вызов выполняется в контексте процесса, в основном это означает, что процесс выполняется в режиме ядра для запуска системного вызова. Когда ядро ​​обрабатывает системный вызов, оно все еще выполняется в процессе, вызывающем процессе. Если он решит -перепланировать, процесс приостанавливается, и выполнение продолжается в любом другом запланированном процессе.

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

Большое изменение в 2.6 в отношении планирования заключалось в том, что раньше процессы можно было прерывать только в пользовательском режиме; с предварительно -очищаемым ядром процессы также могут быть прерваны в режиме ядра (, за исключением случаев, когда они отключают упреждающее -освобождение, что делается вокруг критических участков кода ядра ).

2
28.04.2021, 23:29

Теги

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