2009-08-10 5 views
5

Linuxのwrite()関数のかなり高いレベルで、0の長さのバッファを書き込む要求がフィルタされます。どちらが理にかなっている。誰がOSを浪費したいのですか?層を掘削するだけなので、何の作業もできないと判断できますか?長さゼロのwrite()を呼び出すとどうなりますか?

まあ...私。

これは、questionに関連しています。ハンドシェイクが間違っていると、アドレス(バスの前にバス上で送信された)がエラーを返す場合、ビットバンギングされたI2Cドライバが潜在的に有用なリターンコードを与えることを発見しました。

私は使用しているデバイスではなく、アドレスの後にダミーデータを送ることができます。 (たぶん私は読んでみる...)。

そこで質問です:カーネルはゼロ(0)の長さが書き込みを許可した場合に解き放たれることになる地獄のどのような?

答えて

2

私はウォーレン・ヤングのドライバーの更新とパッチの公開について考えています(ラウンドがあるときはtuit)。

+0

これは私たちの残りの部分を最終的に助けるでしょう。ありがとうございました –

0

ない深刻な答え:あなたはtouchのようなプログラムかもしれません:Pを

1

はほとんど、私が思うだろう - 長さゼロの書き込みがブロックされる可能性があるかもしれないならば、それはへの書き込みのバッファいくつかのドライバでは利用可能なスペースもゼロです。長さゼロの書き込みを許可しないと、そのような場合には単純化するだけでなく、多くの無駄な作業を避けることができます。

なぜそのチェックを外して実際にどのような地獄が緩んでいるのか分かりませんか? :)

5

あなたが説明しているのは、予期せぬ量のメモリを必要とするいくつかのWindows APIに感染しているのと本質的に同じ種類の悪です。実際には、バッファを持たずに作業を行うためにバッファを呼び出すことですが、結果を格納せずに作業を行いますが、途中で必要なバイト数を数えます。次に、そのサイズのバッファを割り当て、サイズを知っているバッファで関数を再度呼び出します。

これは明らかに悪です。これは、腐敗した官僚制のコンピュータプログラミングに相当します。各部門では、前の部門に与えた情報とほとんど同じ情報を持つフォームを記入する必要がありますが、各フォームには異なる情報があるため、彼らはあなたが他の人に与えた形のコピーを取るだけではありません。 Ptui!

プログラマー時間がかかり、CPU時間がかかります。プログラマーに同じAPIコールをN回書くよう要求することで、API自体がうまくいくかもしれないいくつかの世界の状態を取り除いて、これを頭で動かそうとします。

ベストプラクティスでは、ドライバがwrite()が確実に成功するようにすべての操作を行うようにしてください。世界の状態を確認することで成功できないことを事前に予測できる場合は、ioctl()にする必要があります。

+0

ハードウェアの回避策はカーネルに属していますが、そうでない場合、これは非常に古い(維持されていない)カーネルであるため、ユーザー空間で回避するのが妥当かもしれません。 – bdonlan

+0

しかし、この場合私は実際には書いたくないので、窓の類推は当てはまりません。私は_really_ゼロバイトを '書き込み'したい。さもなければ、私は確立されたドライバに独自のioctl呼び出しを追加することでAPIを変更しています。 – Jamie

+3

私は、ドライバに独自の呼び出しを加えるべきではないと思います。私はあなたがこのドライバを保守している人にこの動作を指摘して、この機能を公開するように頼んだり、パッチを提供したりするべきだと思います。これはI2C_PING関数と呼ぶことができます。 ioctls()は、これを行う1つの方法です。/procとsysctlは他のものです。 –

0

私はioctl()を示唆していますが、インタフェースに関する状態情報を取得するためのより良いインタフェースではないでしょうか?

0

長さゼロの書き込みは何を意味しますか?一般的には、書き込みはデータの転送を意味します...そして、私は、それをチェックしないことによって多くの問題がドライバーに多くの悪い入力を引くことによって引き起こされると確信しています。y

情報ビットが1つの情報である場合は、「do this」コールが終わった場合は、ioctlを使用することをお勧めします。それは可愛いわけではありませんが、何ができますか?

また、原子力オプションを利用してmmap()を使用し、すべてをユーザー空間に移動します。オーバーヘッドが低く、「このレジスタにXを書き込む」のような古典的なポークコードを書くことができます。これはほぼ必要と思われるものです。

関連する問題