河野真治 @ 琉球大学情報工学です。

そういえば、serial たたくだけなら pty はいらないです。

In article <avwtun9dxi.fsf@solaris.ozen.prv>, psbfan@po.harenet.ne.jp writes
> 出力に、0x00と\nが大量に吐き出され、そのあいだに、shellの出力のかがまりが
> なんども現れ、そのうち、overflowの合図らしきbeepがひたすら続きます。

うん。そんなものでしょう。0x00が大量に出るのは、pty のpadding
で出るのが正しい時もあります。
         if((bytes = read(sfd, buf, sizeof buf)) == -1){ error and exit }
         if((len = write(1, buf, bytes)) == -1)        { error and exit }
だから、read してないときでも write にいっちゃうので、そうなります。
         if((bytes = read(sfd, buf, sizeof buf)) != -1) {
             write(1, buf, bytes);
         }
ぐらい?  (対処しないなら write のerrorみてもしょうがない...)

> > > tcgetattr ..etc.. tcsetattr
> > system("stty raw"); とかですませたりします。:-p
> なるほど。気づかなかった。

いや、setattr が正しいんですよ。stty raw だと設定できない部分も
あるので。

> これもよく聞く話ですが、なにせ、自分では簡単なものしか
> かかないので、debugでもっとこんがらがりそう。

tty の振舞いとかは調べてみないと良くわからないですよね。特に、
termios で、MIN とか TIME とかって、man みてもピンとこないで
しょうし。なので、gdb で動作を見るのは、お勧めです。

> 簡単ではないとなると、どのくらいの難易度なのでしょうか。
> 学部の学生さんなら、たいていは書けるっていうくらいなら
> 一通り、マスターしようと思うのですが。

   level 1        read/write を使った cat
   level 2        select を使った read のチェック
   level 3        read/writeを同時に使う非同期的なI/Oの扱い
   level 4        socket を使った IPC
   level 5        termios の扱い
   level 6        pty の扱い (IPCとtermiosの組合せ)

ってな感じなんで、それぞれ1-2日程度かかるってな感じかな。

結構、高度だと思う。

---
Shinji KONO @ Information Engineering, University of the Ryukyus
河野真治 @ 琉球大学工学部情報工学科