Open7
WasmLinux: Emscripten版にコンソールを繋ぐ
というわけでEmscripten版にコンソールを繋ぐ。やることが多くて:
- ダミーのネットワークコードを書く。Emscripten内ではTCP/IPできないので、ポートさえ合っていればTCPで繋がっているように見せるダミーを用意する。
- ビルドをhtmlからmjsに変更する。Emscriptenは一応HTMLのテンプレートを差し替える機能も提供するが、mjsにして自分でロードした方が簡単と言える。
- デバッグprintfを別の関数に置換して、起動後は別のコンソールにリダイレクトする。まぁxterm.jsを2枚開いて、JavaScript側に出力関数を用意してやるのが簡単かな。
とりあえずCygwin上でテスト
なんとなく動いた。これでネットワーク通信一切なし、ttyに直接 ioctl
という状況にできたので、これをxterm-pty上で動作させれば期待通り動作する。はず。
I/Oバックエンドは適当な実装。とりあえず動くが、簡単のために accept
したソケットは直ぐ start_read
されるという仮定を置いている。こうすることで、 write
を失敗させなければならない(writeしたデータが対向するコンテキストにqueueできない)ケースを無くせる。
ついでに、出力がごっちゃにならないようにデバッグ出力を止める機能をrunner側に入れた。
xterm-ptyをリンクできない
error: undefined symbol: malloc (referenced by $PTY_waitForReadableWithAtomic, referenced by $PTY_waitForReadable, referenced by fd_read, referenced by root reference (e.g. compiled C/C++ code))
warning: To disable errors for undefined symbols use `-sERROR_ON_UNDEFINED_SYMBOLS=0`
warning: _malloc may need to be added to EXPORTED_FUNCTIONS if it arrives from a system library
うーん。。とりあえず指示に従ってみる。。?
xterm-ptyのサンプルで正常にCSSをロードしてこない
<link rel="stylesheet" href="https://unpkg.com/xterm@5.3.0/css/xterm.css" crossorigin />
という感じに crossorigin
が必要だと思うんだけど、無しで上手くいくCORS設定がある。。?
lsしたら死ぬ
うーん。。まだmismatchがあんのか。。debug printに真面目に対応しないとデバッグが厳しいな。。
そもそもシグナルハンドラを正常に渡せていない
とりあえずdebug printを足してみた。
ひでぇtypoを直したんだけどまだ発生する。とりあえずEmscripten上だと関数ポインタとしてゼロが渡ってそうなことは解った。
再現しない
とりあえず ping
とかをSIGINTで止めると再現できる ことがある ので、これもメモリ破壊事象っぽいな。。つまり、確率的に sigaction
の引数を壊しているのではないか説。