Armadilloフォーラム

ファイルオープンエラーの件

momura

2018年2月26日 21時02分

大村と申します。下記ご教示をお願い致します。
Armadillo-840mにて、Qtアプリケーションを開発しています。
外部からSPIにてデータを取込み(現状MAXの12MHz)、
それをHDMI画面に表示すると共に、USBメモリに書き込んでいます。
これを常時、繰り返し行なっています。画面表示のため、スレッドも使っています。
最初のうちは、動いていますが、しばらくすると
SPIのデバイスオープンエラーや、USBのファイルオープンエラーが起こります。
ioctr()関数を使っているため、errnoを調べると'24'となっています。
こちらの調べが正しければ、このエラーはOPEN_MAX以上のファイル数を同時に開いているため
に起こるようですが、それで正しいでしょうか?
また、このエラーを防ぐには、開けるファイル数を増やす、メモリー領域を増やすなど
対処したいのですが、その方法が分かりません。
またOPEN_MAXがどこで定義されているかも分かりません。
この現象を防ぐための方法をご教示戴きたく、何とぞよろしくお願い申し上げます。
また、ヒントでも何でも何か情報がありましたら、ご回答をお願い致します。

コメント

中村です。

> これを常時、繰り返し行なっています。画面表示のため、スレッドも使っています。
> 最初のうちは、動いていますが、しばらくすると
> SPIのデバイスオープンエラーや、USBのファイルオープンエラーが起こります。
> ioctr()関数を使っているため、errnoを調べると'24'となっています。
> こちらの調べが正しければ、このエラーはOPEN_MAX以上のファイル数を同時に開いているため

どこかにclose()忘れがあるのではないでしょうか?

--
なかむら

花田です。なかむらさんの付け加えになりますが…

> 開けるファイル数を増やす

これはsetrlimit()で行えるものの、そもそも千以上のファイル(デバイス)を同時にopenする設計にせざるを得ないときに使うものです。
lsofコマンドが存在する環境であれば、どのファイルがどれだけopenされているかを確認できますが…

(lsofとgerlimit/setrlimitについて解説されています)
https://siguniang.wordpress.com/2012/02/29/lsof-and-open-file/

そういった設計でないのであれば、

なかむらさん> どこかにclose()忘れがあるのではないでしょうか?

をチェックしてください。(ループ処理中や何度も呼ばれる関数内にopenがあり、同じファイルが何度も多重に開かれてMAXを超えるのがよくあるケースです)

> 花田です。なかむらさんの付け加えになりますが…
>
> > 開けるファイル数を増やす
>
> これはsetrlimit()で行えるものの、そもそも千以上のファイル(デバイス)を同時にopenする設計にせざるを得ないときに使うものです。
> lsofコマンドが存在する環境であれば、どのファイルがどれだけopenされているかを確認できますが…
>
> (lsofとgerlimit/setrlimitについて解説されています)
> https://siguniang.wordpress.com/2012/02/29/lsof-and-open-file/
>
> そういった設計でないのであれば、
>
> なかむらさん> どこかにclose()忘れがあるのではないでしょうか?
>
> をチェックしてください。(ループ処理中や何度も呼ばれる関数内にopenがあり、同じファイルが何度も多重に開かれてMAXを超えるのがよくあるケースです)

ご返信ありがとうございます。
通常処理では、オープン、読込みor書込み、クローズを一連して行なっておりますので、
クローズ忘れはないと思われますが、何かイレギュラーな処理が起こった時に
そうならないか、確認中です。
参考にさせて戴きます。
ありがとうございました。

> > 花田です。なかむらさんの付け加えになりますが…
> >
> > > 開けるファイル数を増やす
> >
> > これはsetrlimit()で行えるものの、そもそも千以上のファイル(デバイス)を同時にopenする設計にせざるを得ないときに使うものです。
> > lsofコマンドが存在する環境であれば、どのファイルがどれだけopenされているかを確認できますが…
> >
> > (lsofとgerlimit/setrlimitについて解説されています)
> > https://siguniang.wordpress.com/2012/02/29/lsof-and-open-file/
> >
> > そういった設計でないのであれば、
> >
> > なかむらさん> どこかにclose()忘れがあるのではないでしょうか?
> >
> > をチェックしてください。(ループ処理中や何度も呼ばれる関数内にopenがあり、同じファイルが何度も多重に開かれてMAXを超えるのがよくあるケースです)

中村です。

> 通常処理では、オープン、読込みor書込み、クローズを一連して行なっておりますので、
> クローズ忘れはないと思われますが、何かイレギュラーな処理が起こった時に
> そうならないか、確認中です。

適当なスクリプトか何かで定期的に、
そのプロセスの[PID]で、
ls /proc/[PID]/fd

ls -l /proc/[PID]/fd
をやってみると、何かわかるかもしれません。

--
なかむら

なかむら様、花田様

ファイルオープンの件は、解決しました。
ありがとうございました。
やはり、オープンしている箇所がクローズ箇所より多いことが分かりました。
感謝申しあげます。
またよろしくお願い申し上げます。

           大村