pkg://SCSI-Programming-HOWTO.tar.gz:32672/SCSI-Programming-HOWTO-6.html
downloads
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
<TITLE>The Linux SCSI programming HOWTO: デバイスプログラミングの概要</TITLE>
<LINK HREF="SCSI-Programming-HOWTO-7.html" REL=next>
<LINK HREF="SCSI-Programming-HOWTO-5.html" REL=previous>
<LINK HREF="SCSI-Programming-HOWTO.html#toc6" REL=contents>
</HEAD>
<BODY>
<A HREF="SCSI-Programming-HOWTO-7.html">次のページ</A>
<A HREF="SCSI-Programming-HOWTO-5.html">前のページ</A>
<A HREF="SCSI-Programming-HOWTO.html#toc6">目次へ</A>
<HR>
<H2><A NAME="s6">6. デバイスプログラミングの概要</A></H2>
<P>ヘッダファイル <CODE>include/scsi/sg.h</CODE> はインターフェースの記述を
含んでいます(カーネルバージョン 1.3.98 に基づいています):
<P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
struct sg_header
{
int pack_len; /* やってくるパケット長 (ヘッダ込み) */
int reply_len; /* 期待される応答の最大長 */
int pack_id; /* パケットの id ナンバー */
int result; /* 0==ok, それ以外は errno コードを指示 */
unsigned int twelve_byte:1;
/* グループ 6 & 7 コマンドに対し 12 バイトコマンド長を強制 */
unsigned int other_flags:31; /* 将来用 */
unsigned char sense_buffer[16]; /* read によってのみ使用される */
/* コマンドに続いてコマンドのためのデータ(?) */
};
</PRE>
</CODE></BLOCKQUOTE>
<P>
<P>この構造体はどのように SCSI コマンドが処理され、また、コマンドの実行結果を
保持する空間を持っているかを表しています。
個々の構造体の構成要素については
<A HREF="SCSI-Programming-HOWTO-8.html#sec-header">sec-header</A>
章で後に議論します。
<P>
<P>汎用デバイスとデータを交換する通常の方法は以下のようになります:
オープンした汎用デバイスに対しコマンドを送るために
次の三つの部分を含むブロックをデバイスに対して <CODE>write()</CODE> します。
<P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
struct sg_header
SCSI コマンド
コマンドと一緒に送られるべきデータ
</PRE>
</CODE></BLOCKQUOTE>
<P>
<P>
<P>コマンドの結果を獲得するには、これ(と同様な)ブロック構造体を用いてブロックを
<CODE>read()</CODE> します。
<P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
struct sg_header
デバイスからやって来るデータ
</PRE>
</CODE></BLOCKQUOTE>
<P>
<P>これが処理過程の通常の概要です。以降の章で各ステップをもっと詳しく
記述します。
<P>
<P>注意:最近のカーネルバージョンに至るまで、SIGINT シグナルを
<CODE>write()</CODE>と対応する<CODE>read()</CODE>の呼び出しの間でブロックする必要があ
りました(つまり <CODE>sigprocmask()</CODE> によって)。<CODE>write()</CODE> 部から結果
を取ってくるための <CODE>read()</CODE> なしで復帰することは続いて起こるアクセ
スをブロックすることになります。このシグナルのブロックは見本のコードに
は含まれていません。ですからこれらの見本を走らせる際には SIGINT (a la
が訳せない^C )を発行するべきではありません。
<P>
<HR>
<A HREF="SCSI-Programming-HOWTO-7.html">次のページ</A>
<A HREF="SCSI-Programming-HOWTO-5.html">前のページ</A>
<A HREF="SCSI-Programming-HOWTO.html#toc6">目次へ</A>
</BODY>
</HTML>