シリアルポートの設定が「制御線を使う」になってるとき、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()に生まれ変わるべき。