総合手引 | セクション 9 | English | オプション |
#include <sys/types.h>
#include <sys/uio.h>
struct uio { struct iovec *uio_iov; int uio_iovcnt; off_t uio_offset; int uio_resid; enum uio_seg uio_segflg; enum uio_rw uio_rw; struct thread *uio_td; };
文字型デバイスのドライバに渡された、あらゆる read(2), write(2), readv(2) ないし writev(2) システムコールの結果として、適切なドライバの d_read または d_write エントリが struct uio 構造体のポインタを渡されて呼び出されます。 転送のリクエストは、この構造体の中にエンコードされます。 ドライバ自身もこの構造体の中のデータを取り出すために uiomove() を使用するべきです。
uio 構造体の各フィールドは下記のとおりです。
uio_iov | |
処理すべき入出力ベクタの配列です。 散在的な入出力の場合には、一つ以上のベクタとなるでしょう。 | |
uio_iovcnt | |
存在している入出力ベクタの数を示します。 | |
uio_offset | |
デバイスのオフセットです。 | |
uio_resid | |
処理すべきバイト数です。 | |
uio_segflg | |
以下のフラグの中の一つです。 | |
UIO_USERSPACE | |
入出力ベクタはプロセスのアドレス空間を指しています。 | |
UIO_SYSSPACE | |
入出力ベクタはカーネルのアドレス空間を指しています。 | |
UIO_NOCOPY | |
オブジェクト中に既にデータがあり、コピーしません。 | |
uio_rw | |
要求された転送の方向を示し、 UIO_READ または UIO_WRITE です。 | |
uio_procp | |
スレッドに関連付けられた struct thread 構造体へのポインタです。 uio_segflg がプロセスのアドレス空間との転送をすべきであると示している場合に 使用されます。 | |
/* MIN() の定義はこの中にあります */ #include <sys/param.h>#define BUFSIZE 512 static char buffer[BUFSIZE];
static int data_available; /* 読み込めるデータ量 */
static int fooread(dev_t dev, struct uio *uio, int flag) { int rv, amnt;
rv = 0; while (uio->uio_resid > 0) { if (data_available > 0) { amnt = MIN(uio->uio_resid, data_available); rv = uiomove(buffer, amnt, uio); if (rv != 0) break; data_available -= amnt; } else tsleep(...); /* より良い時期まで待つ */ } if (rv != 0) { /* エラーのクリーンアップをここで行なう */ } return (rv); }
UIO (9) | February 2, 1997 |
総合手引 | セクション 9 | English | オプション |
このマニュアルページサービスについてのご意見は Ben Bullock にお知らせください。 Privacy policy.
“ | Do you laugh when the waiter drops a tray full of dishes? Unix weenies do. They're the first ones to laugh at hapless users, trying to figure out an error message that doesn't have anything to do with what they just typed. | ” |
— The Unix Haters' handbook |