私はlibgpiodのインターフェースを中心にいくつかのコードを書いています。たとえば、高レベルを出力するようにラインを設定したいとします。フード, libgpiod はその行に対してカーネルが提供した fd を開きますioctl(fd, GPIO_V2_LINE_SET_VALUES_IOCTL, ...)
。
私の質問は次のとおりです
この特定の
ioctl()
呼び出し(GPIO_V2...
パラメータを含む)は理論的に(おそらく)次に終了できますか?書くどのファイル記述子でも可能ですか?ioctl()
理論的には、通貨は一般的にブロックされていますか?例えば、第1の要求ラインにはioctl()
チップのfdも含まれる。 I2Cはどうですかioctl()
?fd
ブロックする場合、struct() 行の基本項目は、イベントループ( libuv などの抽象イベントライブラリ)line->fd_handle->fd
で待たなければならない項目ですか?epoll()
私は研究を通してこの質問に答えようとしましたが、(a)「ioctl」と「blocking」の組み合わせを検索すると、次のような結果が得られます。環境fdブロックを実行し、(b)私が見つけることができるマニュアルページやカーネル文書にはありません。
答え1
GPIO_V2_LINE_SET_VALUES_IOCTL
十分に安全なようです。意図した用途に適しています。ioctl
、「特殊ファイルの低レベルデバイスパラメータの操作」。実装linereq_set_values
、ロックを獲得しますが、ロックが無期限にブロックされる可能性があるとは思いません(そのユーザーはすべてブロックしません)。理論的に
ioctl
、sは主にドライバを設定するために使用されるため、非ブロックになると予想できます。しかし、いくつかioctl
はそれよりはるかに多くのことをしています。例えば、FICLONERANGE
そしてFICLONE
実際のI / Oの場合、悪いことは、いくつかのネットワークファイルシステム(NFS v4.2など)のサポートを受けているため、無期限にブロックされる可能性があることです。上記の1を参照してください。
答え2
まず、GPIO uAPIはioctl()
同期です。つまり、操作が完了するまで返されません。非同期ではないので、タスクを開始して完了通知を待つことができます。
したがって、3番目の質問には、GPIO uAPIが完了するのを待つfdはありません。呼び出しスレッドは、ioctl()
操作が完了するまで返されません。ioctl()
(uAPI では、fds の読みやすさは s とは関係ありませんが、非同期ioctl()
イベントが発生してファイルからイベントの詳細を読み取ることができることを示します.ライン要求 fds の場合はエッジイベントです.解除するか再構成するか。
ioctl()
最初の質問に対する私の最初の反応は、例えばGPIO uAPIがGPIO_V2_LINE_SET_VALUES_IOCTL
実際にはブロックされていないということです。共有状態を上書きするミューテックスを含めることができますが、最終的にハードウェアを制御するレジスタへの書き込みを保護し、これらの書き込みはほぼ直ちに返されるため、すべての競合は一時的であり、オーバーヘッドはユーザースペースのスレッド間のコンテキスト切り替えよりも少なくなります。これを考慮すると、ループ内でも直接呼び出すことができますepoll()
。
これは、SOCおよびマイクロコントローラで直接ホストされているGPIOの場合に当てはまりますが、I2C、SPI、またはその他の手段を介して接続されたGPIO拡張チップの場合、そのioctl()
トランザクションが完了するまで返されません。所要時間はバスなどによって異なり、待ち時間が重要かどうかはアプリケーションによって異なります。イベントループを無期限にブロックすることはありませんが、必要なものより長く持続する可能性があります。
したがって、最初の質問に答えると、無期限のブロックを意味する場合はいいえ、無期限のブロックは避けてください。しかし、場合によっては完了するのにかなり時間がかかることがあります。これはあなたにとって重要な場合があります。
私はこれが2番目の質問にも当てはまると思います。一般的に言えば、非ブロックと見なすことができますが、これは特定の状況ioctl()
やアプリケーションによって異なります。