• home
  • about
  • 全ての投稿
  • ソフトウェア・ハードウェアの設定のまとめ
  • 分析関連のまとめ
  • ヘルスケア関連のまとめ
  • 生涯学習関連のまとめ

termios

date: 2022-01-11 excerpt: termiosの使い方

tag: termiosterminalstdin,stdout


termiosの使い方

概要

  • 端末属性の取得と設定、回線制御、ボーレートの取得と設定
    • vim, tmux, screenなどのtemrinalのソフトウェアを作る際に必要な機能と設定

man

  • TERMIOS(3)

stdinのロックを解除して一文字づつ読み込む

  • termiosを使った非同期のstdin, stdout
    • stdinを普通に読み込もうとするとロックされてしまう
    • 同期的にのみにしか操作をおこなえいないので、termiosで設定を変えて非同期的に行えるようにする
  • 動作
    • 以下の例では現在の状態を取得して、モードを変更して、2秒間、terminalをポーリングする
    • 入力された情報を文字列として出力する
import time
import sys
import os
import termios

# ロック解除と前の設定を保存
print(sys.stdin.fileno())
old_settings = termios.tcgetattr(sys.stdin)
new_settings = termios.tcgetattr(sys.stdin)
new_settings[3] = new_settings[3] & ~(termios.ECHO | termios.ICANON)  # lflags
new_settings[6][termios.VMIN] = 0
new_settings[6][termios.VTIME] = 0
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, new_settings)
# ロック解除の操作は以下のコマンドとほぼ同じ
# os.system('/bin/stty raw')
start = time.time()
chars = ["test"]


start = time.time()

while time.time() - start < 2:
    char = os.read(sys.stdin.fileno(), 1).decode("utf8")
    if char != "":
        chars.append(char)
# 状態の復元
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_settings)
# 状態の復元は以下のコマンドでも可能
# os.system("/bin/stty cooked")

print("d", "|".join(chars))


termiosterminalstdin,stdout Share Tweet