Open4

読解SwiftTerm

KyomeKyome

このスクラップでは[migueldeicaza/SwiftTerm]を読解して、最小限機能の実装に何が必要なのかをまとめる。

KyomeKyome

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を強制終了したいとき

KyomeKyome

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に対してデータ/入力を送っている

KyomeKyome

ミス発見

  • dateとdataのタイポ
  • getEnvironmentVariables()で二度USERって書いてる