Armadilloフォーラム

SELECT() ブロッキングについて

t.takahashi00

2018年9月5日 13時49分

Armadillo実践開発ガイド の”serial_echo_server3.c”をベースとしてUSBに接続されたWi-SUNモジュール(ドングル)からデータを連続して取得し、コンソールへ出力するアプリを作成しています。
現状、コンソールをデフォルト(COM3:ttycmx1)に接続したPCとして動作させた場合は正常に機能するのですが、コンソールをLCDに切り替えて(/sbin/getty 38400 tty1 linux)同じアプリを動作させたところ、初めは正常に表示するのですが、途中から表示が止まってします。(”select”を実行したまま戻ってこれない様子:USBへの入力を検出できていない?)ただし、「^C」には反応しますのでアプリ自体がハングアップしているわけではないようです。
状況からLCDに切り替えたことが原因と思われるのですが、コンソールをLCDに切り替える際に実行すべき何かが抜けているのでしょうか。若しくはアプリを作る上で注意すべきことがあるのでしょうか。恐れ入りますがご存知の方がおられましたら、ご教示いただけますようお願いいたします。

コメント

at_kojiro.yamada

2018年9月21日 13時50分

> Armadillo実践開発ガイド の”serial_echo_server3.c”をベースとしてUSBに接続されたWi-SUNモジュール(ドングル)からデータを連続して取得し、コンソールへ出力するアプリを作成しています。
> 現状、コンソールをデフォルト(COM3:ttycmx1)に接続したPCとして動作させた場合は正常に機能するのですが、コンソールをLCDに切り替えて(/sbin/getty 38400 tty1 linux)同じアプリを動作させたところ、初めは正常に表示するのですが、途中から表示が止まってします。(”select”を実行したまま戻ってこれない様子:USBへの入力を検出できていない?)ただし、「^C」には反応しますのでアプリ自体がハングアップしているわけではないようです。
> 状況からLCDに切り替えたことが原因と思われるのですが、コンソールをLCDに切り替える際に実行すべき何かが抜けているのでしょうか。若しくはアプリを作る上で注意すべきことがあるのでしょうか。恐れ入りますがご存知の方がおられましたら、ご教示いただけますようお願いいたします。

select()にはWi-SUNモジュールからのread, コンソールへのwriteで2つのfdを渡していると思います。

select()でブロックしたままになるのは
- 読み込み可能にならない
- 書き込み可能にならない
のどちらか(もしくは両方)です。

本来なら上記どちらが原因でselect()がブロックしているのか確認するのが先ですが、
今回は出力先を変更した場合に問題が起きるということなので、書き込み可能にならないと仮定したうえで
思いついた対処法を書いておきます。

とりあえず、write() した後に fflush(fd)してみていただけますか?
fdはwrite()渡したファイルディスクリプタです。printfなど標準出力を利用しているのであれば、stdoutを渡してください。