momura
2018年2月26日 21時02分
大村と申します。下記ご教示をお願い致します。
Armadillo-840mにて、Qtアプリケーションを開発しています。
外部からSPIにてデータを取込み(現状MAXの12MHz)、
それをHDMI画面に表示すると共に、USBメモリに書き込んでいます。
これを常時、繰り返し行なっています。画面表示のため、スレッドも使っています。
最初のうちは、動いていますが、しばらくすると
SPIのデバイスオープンエラーや、USBのファイルオープンエラーが起こります。
ioctr()関数を使っているため、errnoを調べると'24'となっています。
こちらの調べが正しければ、このエラーはOPEN_MAX以上のファイル数を同時に開いているため
に起こるようですが、それで正しいでしょうか?
また、このエラーを防ぐには、開けるファイル数を増やす、メモリー領域を増やすなど
対処したいのですが、その方法が分かりません。
またOPEN_MAXがどこで定義されているかも分かりません。
この現象を防ぐための方法をご教示戴きたく、何とぞよろしくお願い申し上げます。
また、ヒントでも何でも何か情報がありましたら、ご回答をお願い致します。
コメント
at_hanada
花田です。なかむらさんの付け加えになりますが…
> 開けるファイル数を増やす
これはsetrlimit()で行えるものの、そもそも千以上のファイル(デバイス)を同時にopenする設計にせざるを得ないときに使うものです。
lsofコマンドが存在する環境であれば、どのファイルがどれだけopenされているかを確認できますが…
(lsofとgerlimit/setrlimitについて解説されています)
https://siguniang.wordpress.com/2012/02/29/lsof-and-open-file/
そういった設計でないのであれば、
なかむらさん> どこかにclose()忘れがあるのではないでしょうか?
をチェックしてください。(ループ処理中や何度も呼ばれる関数内にopenがあり、同じファイルが何度も多重に開かれてMAXを超えるのがよくあるケースです)
momura
> 花田です。なかむらさんの付け加えになりますが…
>
> > 開けるファイル数を増やす
>
> これはsetrlimit()で行えるものの、そもそも千以上のファイル(デバイス)を同時にopenする設計にせざるを得ないときに使うものです。
> lsofコマンドが存在する環境であれば、どのファイルがどれだけopenされているかを確認できますが…
>
> (lsofとgerlimit/setrlimitについて解説されています)
> https://siguniang.wordpress.com/2012/02/29/lsof-and-open-file/
>
> そういった設計でないのであれば、
>
> なかむらさん> どこかにclose()忘れがあるのではないでしょうか?
>
> をチェックしてください。(ループ処理中や何度も呼ばれる関数内にopenがあり、同じファイルが何度も多重に開かれてMAXを超えるのがよくあるケースです)
momura
ご返信ありがとうございます。
通常処理では、オープン、読込みor書込み、クローズを一連して行なっておりますので、
クローズ忘れはないと思われますが、何かイレギュラーな処理が起こった時に
そうならないか、確認中です。
参考にさせて戴きます。
ありがとうございました。
> > 花田です。なかむらさんの付け加えになりますが…
> >
> > > 開けるファイル数を増やす
> >
> > これはsetrlimit()で行えるものの、そもそも千以上のファイル(デバイス)を同時にopenする設計にせざるを得ないときに使うものです。
> > lsofコマンドが存在する環境であれば、どのファイルがどれだけopenされているかを確認できますが…
> >
> > (lsofとgerlimit/setrlimitについて解説されています)
> > https://siguniang.wordpress.com/2012/02/29/lsof-and-open-file/
> >
> > そういった設計でないのであれば、
> >
> > なかむらさん> どこかにclose()忘れがあるのではないでしょうか?
> >
> > をチェックしてください。(ループ処理中や何度も呼ばれる関数内にopenがあり、同じファイルが何度も多重に開かれてMAXを超えるのがよくあるケースです)
y.nakamura
momura
y.nakamura
2018年2月26日 21時39分
中村です。
> これを常時、繰り返し行なっています。画面表示のため、スレッドも使っています。
> 最初のうちは、動いていますが、しばらくすると
> SPIのデバイスオープンエラーや、USBのファイルオープンエラーが起こります。
> ioctr()関数を使っているため、errnoを調べると'24'となっています。
> こちらの調べが正しければ、このエラーはOPEN_MAX以上のファイル数を同時に開いているため
どこかにclose()忘れがあるのではないでしょうか?
--
なかむら