揮発性のメモ2

http://d.hatena.ne.jp/iww/

O_NONBLOCK

シリアルポートの設定が「制御線を使う」になってるとき、open()が固まってしまうことがある。

# stty -aF /dev/ttyS0
speed 9600 baud; rows 0; columns 0; line = 0;
中略
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
後略                                     ↑ここ

The Linux Modem-HOWTO : $BCN$C$F$$$k$HNI$$$*$b$7$m$$%W%m%0%i%`(B
シリアル・ポートを使ってディジタル入出力
ようするに、DCD信号を見てしまうのでopen()が返ってこない、らしい。
tcsetattr()clocalを設定したいのにこれでは鶏と卵だ。
したがって、open()O_NONBLOCKでおこない、そのあとにfcntl()O_NONBLOCKを解除するなどの回り道が必要。
これは「全ての制御線がちゃんと使えるシリアルポート」を扱うときには注意する必要がある、はず。
それか、sttyコマンドであらかじめ無効にしておく


fcntl()の語感の悪さは異常。来世ではfctrl()に生まれ変わるべき。