gpt4 book ai didi

linux - 旧的 Linux 内核奇怪的行为

转载 作者:太空狗 更新时间:2023-10-29 11:19:13 26 4
gpt4 key购买 nike

我有一个带有最小自定义 linux 内核的旧设备。大约 20 年前,我们从一家公司购买了该设备,并对其进行了编程以满足我们的需求。

uname -r
2.4.21

我在设备上开发了一个基于文本的 UI,并允许通过 telnet 和串行端口访问它。

当使用 telnet 连接时,调用 read -s STR 两次,导致第二次读取被忽略。发生这种情况是因为 telnet 以 "\r\n" 结束行。

例如:

echo "Enter new password: "; read -s password1
echo "Enter new password again: "; read -s password2 #<--this read returns directly

所以我的解决方案是在每次读取调用后从标准输入读取所有字符。但是,仅使用串行通信 "\n" 作为行尾发送。所以我决定为上面的读取调用添加 1 秒超时。

所以,我基本上是这样结束的:

echo "Enter new password: "; read -s password1
read -t 1 -n 1000 ignore
echo "Enter new password again: "; read -s password2
read -t 1 -n 1000 ignore

令我惊讶的是,read -t 1 有时会阻塞。所以我运行了以下命令来说明这种行为:

set -x

while true;
do
read -t 1 -n 10000 STR
echo "timeout"
sleep 5
done

脚本在 2 个循环后挂起,只有在我按下 enter 时才会继续。

最后我尝试了以下方法:

set -x
unset STR
while true;
do
read -s -n 1 char
if [[ $char == $'\r' ]]
then
read -s -n 1 ignore
break
elif [[ $char == $'\n' ]]
then
break
fi
STR=$STR$char
done

这导致:

++ true
++ read -s -n 1 char
]][[ a == \
++ [[ a == \
]]
++ STR=a
++ true
++ read -s -n 1 char <-------- HERE I PRESSED ENTER
]][[ '' == \
++ [[ '' == \
]]
++ STR=a
++ true
++ read -s -n 1 char

因此 ENTER"\n" 被翻译成 '',因此它不会跳出循环。

在较新的设备上,我们可以更好地控制内核

uname -r
2.6.24.6

问题不会发生,即调用 read 两次不会导致第二次 read 调用被忽略。

有没有人有解决这个问题的想法?

最佳答案

终端正在将每个 '\r' 转换为 '\n',所以您看不出两者之间有什么区别。您可以使用 stty igncr 完全忽略 CR。这样,您的第一种方法应该可行:

stty igncr
echo "Enter new password: "; read -s password1
echo "Enter new password again: "; read -s password2
stty sane

最后的 stty sane 可能没有必要。

如果该方法不起作用,请尝试使用 stty -icrnl(但那样的话,$password1$password2 将有一个\r 在末尾;您可以使用 tr -d '\r' 抑制它。

关于linux - 旧的 Linux 内核奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24076713/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com