Open4
読解SwiftTerm
このスクラップでは[migueldeicaza/SwiftTerm]を読解して、最小限機能の実装に何が必要なのかをまとめる。
SwiftTermのCoreエンジンはLocalProcessに実装されている。
それ以外は全てCUIの実装。要は飾り。
基本的な仕組み
DarwinのAPIを使って制御している。DarwinにPOSIXに準拠したAPIがある。
winsize()
現在のrow, column, x方向のpixelサイズ、y方向のpixelサイズをくれる(UInt16)
waitpid(shellのPID, ExitCodeのポインター, Option)
ExitCodeが取得できるのを待つ?
OptionはWNOHANGを指定している
forkpty()
pidとfdが取得できるらしい。
このとき4番目の引数に欲しいWindowSizeをポインターで渡している
execve("/bin/bash", args, env)
実際のTerminalで実行するようなコマンドを実行している
このとき、argsとenvはCCharの配列に変換されていないといけないらしい
デフォルトでは executable = "/bin/bash"
envのTERM=xterm-256color である。Terminalのデフォルトもそれ
kill(PID, SIGTERM)
processを強制終了したいとき
DispatchSource.makeProcessSource()
プロセスの特定のイベントをモニターする
- identifierはPID
- eventMaskは監視するイベント.exitならprocessの終了
- queueは実行するDispatchQueue
DispatchSourceProcess.activate()
プロセスのモニターを開始する
DispatchSourceProcess.setEventHandler(handler: {})
プロセスのモニターにイベントハンドラーを登録する
SwiftTermではProcessが終了したときの処理を書いている
DispatchIO().read()
Processの標準出力/エラー出力を読み取っている
DispatchIO().setLimt(lowWater:) で一度に読む最小のデータ量、
DispatchIO().setLimit(highWater:) で一度に読む最大のデータ量を指定している
DispatchIO().write()
Processに対してデータ/入力を送っている
ミス発見
- dateとdataのタイポ
-
getEnvironmentVariables()
で二度USERって書いてる