(57)【要約】    【課題】  デバイスステータス取得をデバイスドライバ側で自動的に行うことを可能にする。    【解決手段】  ＣＰＵ１１がアプリケーションプログラム及びデバイスドライバを実行することによって、デバイスドライバは、アプリケーションプログラムの実行によって発生されたシステムコールによって、前記アプリケーションプログラム側から送られた、ステータスデータを格納すべき記憶場所の指定情報を受け取る。そしてデバイスドライバは、前記システムコールに基づき、情報処理装置に接続された外部デバイス１５のステータスデータを取得し、該取得されたステータスデータを、前記受け取った指定情報が示す記憶場所に格納する。【選択図】      図１
2005309511.tif 000002
【特許請求の範囲】
【請求項１】
アプリケーションプログラムを実行可能であるとともに、外部装置を接続可能な情報処理装置において、
アプリケーションプログラムの実行によって発生されたシステムコールによって、前記アプリケーションプログラム側から送られた、ステータスデータを格納すべき記憶場所の指定情報を受け取る受取手段と、
前記システムコールに基づき、前記情報処理装置に接続された外部装置のステータスデータを取得する取得手段と、
前記取得手段によって取得されたステータスデータを、前記受取手段によって受け取った指定情報が示す記憶場所に格納する格納手段と
を有することを特徴とする情報処理装置。
【請求項２】
前記受取手段は、前記指定情報の他に、前記アプリケーションプログラム側から送られた、ステータスデータの取得完了を通知するための所定通知信号を受け取り、
前記取得手段によって取得されたステータスデータが前記格納手段によって前記記憶場所に格納されたとき、前記アプリケーションプログラム側に前記所定通知信号を送信する送信手段を更に有することを特徴とする請求項１記載の情報処理装置。
【請求項３】
前記受取手段は、前記指定情報の他に、前記アプリケーションプログラム側から送られたステータスデータ取得周期値を受け取り、
前記取得手段は、前記受取手段によって受け取ったステータスデータ取得周期値の示す周期で前記ステータスデータ取得を実行することを特徴とする請求項１記載の情報処理装置。
【請求項４】
前記情報処理装置に接続された外部装置の種別を検出する検出手段と、
前記検出手段によって検出された種別に応じて、前記外部装置からステータスデータを取得するためのネゴシエーションを行うネゴシエーション実行手段と、
前記ネゴシエーション実行手段によって実行されたネゴシエーションの結果得られたステータスデータサイズに応じた記憶容量をもつ一時記憶領域を確保する確保手段とを更に有し、
前記取得手段は、前記取得したステータスデータを前記一時記憶領域に一時的に保管し、
前記格納手段は、前記一時記憶領域に一時的に保管されたステータスデータを前記受取手段によって受け取った指定情報が示す記憶場所に格納することを特徴とする請求項１記載の情報処理装置。
【請求項５】
前記アプリケーションプログラムの実行により、印刷データの出力プロセスと、ステータスデータの取得プロセスとを同時に実行させる所定のシステムコールを発生する発生手段を更に有することを特徴とする請求項１記載の情報処理装置。
【請求項６】
前記外部装置との間で情報を送受信するための外部接続インターフェースを更に有し、該外部接続インターフェースは、前記受取手段及び前記取得手段の機能を実現することを特徴とする請求項１記載の情報処理装置。
【請求項７】
アプリケーションプログラム及びデバイスドライバを実行可能であるとともに、外部装置を接続可能な情報処理装置に適用されるステータス取得方法において、
アプリケーションプログラムの実行によって発生されたシステムコールによって、前記アプリケーションプログラム側から送られた、ステータスデータを格納すべき記憶場所の指定情報を受け取る受取ステップと、
前記システムコールに基づき、前記情報処理装置に接続された外部装置のステータスデータを取得する取得ステップと、
前記取得ステップによって取得されたステータスデータを、前記受取ステップによって受け取った指定情報が示す記憶場所に格納する格納ステップと
を有することを特徴とするステータス取得方法。
【請求項８】
前記受取ステップは、前記指定情報の他に、前記アプリケーションプログラム側から送られた、ステータスデータの取得完了を通知するための所定通知信号を受け取り、
前記取得ステップによって取得されたステータスデータが前記格納ステップによって前記記憶場所に格納されたとき、前記アプリケーションプログラム側に前記所定通知信号を送信する送信ステップを更に有することを特徴とする請求項７記載のステータス取得方法。
【請求項９】
前記受取ステップは、前記指定情報の他に、前記アプリケーションプログラム側から送られたステータスデータ取得周期値を受け取り、
前記取得ステップは、前記受取ステップによって受け取ったステータスデータ取得周期値の示す周期で前記ステータスデータ取得を実行することを特徴とする請求項７記載のステータス取得方法。
【請求項１０】
前記アプリケーションプログラムの実行により、印刷データの出力プロセスと、ステータスデータの取得プロセスとを同時に実行させる所定のシステムコールを発生する発生ステップを更に有することを特徴とする請求項７記載のステータス取得方法。
【請求項１１】
前記受取ステップ、前記取得ステップ、及び前記格納ステップは、前記デバイスドライバの実行により実現されることを特徴とする請求項７記載のステータス取得方法。
【請求項１２】
アプリケーションプログラム及びデバイスドライバを実行可能であるとともに、外部装置を接続可能な情報処理装置に適用されるステータス取得方法を、コンピュータに実行させるためのプログラムにおいて、
アプリケーションプログラムの実行によって発生されたシステムコールによって、前記アプリケーションプログラム側から送られた、ステータスデータを格納すべき記憶場所の指定情報を受け取る受取ステップと、
前記システムコールに基づき、前記情報処理装置に接続された外部装置のステータスデータを取得する取得ステップと、
前記取得ステップによって取得されたステータスデータを、前記受取ステップによって受け取った指定情報が示す記憶場所に格納する格納ステップと
を有することを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、ステータス取得方法、及びプログラムに関し、特に、アプリケーションプログラムを実行可能であるとともに、外部装置を接続可能な情報処理装置、該情報処理装置に適用されるステータス取得方法、及び該ステータス取得方法をコンピュータに実行させるためのプログラムに関する。
【背景技術】
【０００２】
従来、情報処理装置にデバイスが接続されていて、情報処理装置が、該デバイスの状態を表す情報であるデバイスステータスを取得しようとする場合、情報処理装置がアプリケーションプログラムを実行することによって、デバイスドライバを介してデバイスに対して、ｒｅａｄシステムコールが発行され、これによって、情報処理装置がデバイスステータスを取得するようにしていた（例えば、特許文献１）。
【０００３】
上記デバイスが、例えばプリンタである場合を例にあげて説明すると、情報処理装置が、プリンタに印刷データを出力しながら、プリンタからステータスを取得するには、下記の２つの手法のうちのいずれかによっていた。
【０００４】
第１の手法では、情報処理装置が、印刷データをプリンタに出力するプロセス（又はスレッド）と、プリンタからステータスを取得するプロセスとを、並行して実行する。すなわち、情報処理装置が、デバイスドライバを介してプリンタにｗｒｉｔｅ／ｒｅａｄシステムコールを発行すると、２つのプロセスが並行して実行され、データ出力とステータス取得とが個別に行なわれる。
【０００５】
第２の手法では、情報処理装置が、印刷データをプリンタに出力するプロセスと、プリンタからステータスを取得するプロセスとを、交互に実行する。すなわち、情報処理装置が、ｗｒｉｔｅシステムコールとｒｅａｄシステムコールとを交互に発行し、データ出力とステータス取得とが交互に行なわれる。
【特許文献１】特開２０００−３５７１４７号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
しかしながら、上記従来の第１の手法を用いた場合、下記に挙げる問題があった。
【０００７】
１．印字プロセスとステータス取得プロセスとが分離して並行に実行されるため、取得したステータスに基づきプリンタの状態変化を検出した場合に、ステータス取得プロセスから印字プロセスに対して、状態変化に即応した処理を求めること（同期）が難しい。
【０００８】
２．情報処理装置が複数のプロセスを同時に制御する必要があるため、アプリケーションプログラムの設計が複雑になる。
【０００９】
また上記第２の手法を用いた場合、下記に挙げる問題があった。
【００１０】
１．時系列に沿ってシステムコールを連続して行うため、何らかの理由（例えばプリンタバッファが満杯など）により１つ前のシステムコールがブロックされると、その後のシステムコールが実行されない事態となる。つまり、ｗｒｉｔｅシステムコールがブロックされている間は、プリンタステータスを取得できない。
【００１１】
２．システムコールが連続するため、印刷処理のスループットが低下する。
【００１２】
すなわち、従来、プリンタステータスを取得する手段（又はきっかけ）がアプリケーションプログラムに任されているため、柔軟なプログラムを開発できる半面、その制御が複雑になるという問題があった。
【００１３】
本発明はこのような問題点に鑑みてなされたものであって、デバイスステータス取得をデバイスドライバ側で自動的に行うことを可能にした情報処理装置、ステータス取得方法、及びプログラム提供することを目的とする。
【課題を解決するための手段】
【００１４】
上記目的を達成するために、請求項１記載の発明によれば、アプリケーションプログラムを実行可能であるとともに、外部装置を接続可能な情報処理装置において、アプリケーションプログラムの実行によって発生されたシステムコールによって、前記アプリケーションプログラム側から送られた、ステータスデータを格納すべき記憶場所の指定情報を受け取る受取手段と、前記システムコールに基づき、前記情報処理装置に接続された外部装置のステータスデータを取得する取得手段と、前記取得手段によって取得されたステータスデータを、前記受取手段によって受け取った指定情報が示す記憶場所に格納する格納手段とを有することを特徴とする情報処理装置が提供される。
【００１５】
また、請求項７記載の発明によれば、アプリケーションプログラム及びデバイスドライバを実行可能であるとともに、外部装置を接続可能な情報処理装置に適用されるステータス取得方法において、アプリケーションプログラムの実行によって発生されたシステムコールによって、前記アプリケーションプログラム側から送られた、ステータスデータを格納すべき記憶場所の指定情報を受け取る受取ステップと、前記システムコールに基づき、前記情報処理装置に接続された外部装置のステータスデータを取得する取得ステップと、前記取得ステップによって取得されたステータスデータを、前記受取ステップによって受け取った指定情報が示す記憶場所に格納する格納ステップとを有することを特徴とするステータス取得方法が提供される。
【００１６】
さらに、上記ステータス取得方法をコンピュータに実行させるためのプログラムが提供される。
【発明の効果】
【００１７】
本発明によれば、アプリケーションプログラムの実行によって発生されたシステムコールによって、前記アプリケーションプログラム側から送られた、ステータスデータを格納すべき記憶場所の指定情報を受け取る。そして、前記システムコールに基づき、情報処理装置に接続された外部装置のステータスデータを取得し、該取得されたステータスデータを、前記受け取った指定情報が示す記憶場所に格納する。
【００１８】
こうした処理をデバイスドライバが行なうことにより、デバイスステータス取得がデバイスドライバ側で自動的に行われ得る。すなわち、アプリケーションプログラムは、ｒｅａｄシステムコールを周期的に発行しなくても、ステータス取得が可能となる。
【００１９】
また、リードライトシステムコールによって１つのシステムコールで、印刷データの出力プロセスとステータスの取得プロセスとが実行される。よって、アプリケーションプログラムの設計が容易になるとともに、システムコールの発生回数を減らすことが可能となるため、入出力処理のスループットが向上する。
【発明を実施するための最良の形態】
【００２０】
以下、本発明を実施するための最良の形態について、図面を参照して説明する。
【００２１】
〔第１の実施の形態〕
図１は、本発明の第１の実施の形態に係る情報処理装置の構成を示すブロック図である。
【００２２】
なお、本実施の形態に係る情報処理装置は、ＵＮＩＸ（登録商標）系のＯＳ（Operating System）を使用することを前提とする。また、該情報処理装置に接続されるデバイスはプリンタを想定し、その接続にはＵＳＢ（Universal Serial Bus）を使用することを前提とする。本実施の形態では上記の前提を設けるが、こうしたＯＳ、接続デバイス種別、及び接続方式に限定されるものではなく、他のＯＳ、接続デバイス種別、及び接続方式であってもよい。
【００２３】
図１において１１はＣＰＵであり、情報処理装置のほぼ全てを管理する。１２はメインメモリであり、ＣＰＵ１１から必要に応じて読み書きされる。１３はＤＭＡ（Direct Memory Access）であり、ＣＰＵ１１に代わって、メインメモリ１２と外部接続ポート群１４との間でデータ転送を行う。外部接続ポート群１４は、セントロニクス、ＵＳＢ、無線、ＩＥＥＥ１３９４、ＬＡＮ等の標準的な外部接続インターフェースで構成された外部デバイス１５への接続ポートである。外部デバイス１５は、本実施の形態においてはプリンタであり、例えばセントロニクスかＵＳＢを使った接続手段をもっており、これらを使って情報処理装置との間でデータの入出力を行う。
【００２４】
こうした構成の情報処理装置において、メインメモリ１２には、アプリケーションプログラムと、外部デバイス１５を管理制御するためのデバイスドライバとが格納され、ＣＰＵ１１によって実行される。
【００２５】
まず、アプリケーションプログラムがデバイスドライバに、接続デバイスのステータスを保存するためのアプリケーションプログラム指定のバッファのアドレス（メモリ１２内の位置を示すポインタ）や、ステータス取得周期などを、システムコール（ＵＮＩＸ（登録商標）系ではｉｏｃｔｌ）によってデバイスドライバに通知する。
【００２６】
デバイスドライバは、情報処理装置に接続されているデバイスの種別（デバイスドライバがプリンタドライバならばプリンタ種別、スキャナドライバならばスキャナ種別）を判別する。デバイス種別ごとにステータス取得のネゴシエーションが異なるので、まずデバイス種別を判別する。そして、デバイス種別に応じて、ステータス取得のためのネゴシエーションをデバイスとの間で行なう。
【００２７】
その後、デバイスドライバは、指定されたステータス取得周期（指定が無い場合もあり得る）で、接続デバイスのステータスの取得を繰り返し、得られたステータスデータをステータス格納バッファに格納するとともに、更新を繰り返す。
【００２８】
そしてデバイスドライバは、ステータスデータの受信を待っているアプリケーションプログラムのプロセスがあれば（すなわち、上記システムコールが実行されていれば）、ステータス格納バッファに格納されたステータスデータを読み出して、アプリケーションプログラム指定のバッファに格納し、アプリケーションプログラムのプロセスに対して、ステータスデータをアプリケーションプログラム指定のバッファに格納した旨を指定のシグナルによって通知する。
【００２９】
アプリケーションプログラムは、この通知の受信によりステータス取得を認知し、指定のバッファからデバイスステータスを入手する。
【００３０】
以上の内容を以下に詳しく説明する。
【００３１】
図２は、図１に示す情報処理装置において、アプリケーションプログラムからデバイスドライバに対して、システムコール（ＵＮＩＸ（登録商標）系ではｉｏｃｔｌ）によって、ステータス取得に関連する各種の指定情報が送られたときに、その指定情報を保管管理するためのプロセス情報リンクリストを示す図である。
【００３２】
このプロセス情報リンクリストは、メモリ１２に格納されるものである。
【００３３】
プロセス情報ヘッダ２１は、プロセス情報リンクリストの先頭をインデックスするポインタである。プロセス情報構造体２２〜２４は各々、アプリケーションプログラムからデバイスドライバに対して送られるシステムコールごとに設定されるものであり、同一の内部構成となっている。
【００３４】
プロセス情報構造体２２において、メンバ（ｐｒｏｃｅｓｓ＿ｉｄ  ２２＿１）には、アプリケーションプログラムが要求するステータス取得プロセスの識別番号が格納される。メンバ（ｓｉｇｎａｌ  ２２＿２）には、このステータス取得プロセスの実行によってステータスが得られ、アプリケーションプログラム指定のバッファに格納されたときに、その旨をアプリケーションプログラムに通知するためのシグナル値が格納される。メンバ（ｕ＿ｂｕｆｆｅｒ  ２２＿３）には、ステータスデータを格納するためのアプリケーションプログラム指定のバッファのメモリ１２内の位置を示すポインタが格納される。メンバ（ｒｅａｄ＿ｓｉｚｅ  ２２＿４）には、取得されたステータスデータのサイズが格納される。メンバ（ｎｅｘｔ  ２２＿５）には、次に発生したプロセスに応じて設定されたプロセス情報構造体２３へのリンク情報（ポインタ）が格納される。
【００３５】
デバイスドライバは、ステータスデータを取得後、このステータスデータをアプリケーションプログラム指定のバッファに格納するプロセスの情報を得るために、このプロセス情報構造体を参照する。
【００３６】
図３は、デバイスドライバによってメモリ１２に格納管理され、接続プリンタごとのステータス取得情報を格納するテーブルを示す図である。
【００３７】
プリンタ情報テーブル３１には、デバイスドライバが管理する接続プリンタの数（図３では（Ｎ＋１）個）だけの情報テーブルが用意される。各情報テーブルは、対応の情報テーブルが使用中であるか否かを表すフラグを格納するメンバ（ａｃｔｉｖｅ  ３１＿１）と、対応プリンタのステータス取得周期（単位はｍｓ）を格納するメンバ（ｉｎｔｅｒｖａｌ  ３１＿２）と、対応プリンタのステータスデータを一時格納するためのメモリ１２内のステータス格納バッファ（プリンタステータスバッファ）の位置を示すポインタを保持するメンバ（ｂｕｆ  ３１＿３）と、そのステータス格納バッファのサイズ（記憶容量）を保持するメンバ（ｓｉｚｅ  ３１＿４）と、対応プリンタをオープンしてアクセスしているアプリケーションプログラムのプロセスが対応するプロセス情報構造体のメモリ１２内の格納位置を示すポインタを保持するメンバ（ｐｒｏｃｅｓｓ＿ｉｎｆｏ  ３１＿５）とから構成される。そして、デバイスドライバの初期化時には、これらのメンバが全てクリアされて０になる。
【００３８】
デバイスドライバは、プリンタの情報処理装置への接続を検出すると、プリンタ情報テーブル３１の中から、メンバ（ａｃｔｉｖｅ  ３１＿１）が０であるものを探す。そして、見つかったメンバ（ａｃｔｉｖｅ  ３１＿１）を１にセットして、この対応する情報テーブルが使用中であることを表す。同時に同じ情報テーブル内のメンバ（ｉｎｔｅｒｖａｌ  ３１＿２）の値をデフォルト値（例えば、２０００ｍｓ）に初期化する。
【００３９】
また、同時にデバイスドライバはプリンタステータスバッファ（ステータス格納バッファ）３２を確保する。すなわち、デバイスドライバは、プリンタの接続を検出すると、そのプリンタ種別を確認する。そして、そのプリンタ種別に応じて、ステータス取得のためのネゴシエーションを行なう。デバイスドライバは、ネゴシエーションを通して、接続プリンタから取得されるステータスのデータサイズの最大値を獲得する。この最大値に基づき、ステータスデータを格納するのに十分な記憶容量を備えたプリンタステータスバッファ（ステータス格納バッファ）３２をメモリ１２内に確保する。この確保したプリンタステータスバッファ（ステータス格納バッファ）３２のメモリ１２内における位置を示すポインタを、プリンタ情報テーブル３１のメンバ（ｂｕｆ  ３１＿３）にセットし、確保したプリンタステータスバッファ（ステータス格納バッファ）３２のサイズをプリンタ情報テーブル３１のメンバ（ｓｉｚｅ  ３１＿４）に格納する。
【００４０】
ところで、プリンタ情報テーブル３１のインデックス（情報テーブルの識別番号）と、プリンタデバイスのＬＵＮ（論理ユニット番号、Logical Unit Number）とは対応している。つまり、アプリケーションプログラムは、プリンタのオープン時に「／ｄｅｖ／ｕｓｂ／ｌｐ（ｎ）」をオープンすることになるが、このｎはプリンタ情報テーブル３１のインデックスに対応する。したがって、プリンタ情報テーブル３１のｎ番目の情報テーブルにおいて、メンバ（ａｃｔｉｖｅ  ３１＿１）が１で無い場合は、オープンに失敗する。
【００４１】
図４は、デバイスドライバによる初期化処理の手順を示すフローチャートである。
【００４２】
デバイスドライバの初期化処理は、システムが起動された時か、または、デマンドロードをサポートしているＯＳの場合は、デバイスドライバがシステムに組み込まれた時に実行される。
【００４３】
図４におけるステップＳ４０では、プロセス情報ヘッダ２１を０に初期化する。
【００４４】
ステップＳ４１では、プリンタ情報テーブル３１を確保し、全メンバを０に初期化する。
【００４５】
図５は、デバイスドライバによるプリンタ情報テーブル３１への各種情報の格納処理の手順を示すフローチャートである。
【００４６】
この格納処理は、デバイスドライバがプリンタの接続を検出した時に実行される処理である。
【００４７】
ステップＳ５０では、プリンタ情報テーブル３１の各情報テーブルを検索し、メンバ（ａｃｔｉｖｅ  ３１＿１）が０である情報テーブルのインデックスを得る。得られたインデックスをローカル変数ｎとする。メンバ（ａｃｔｉｖｅ  ３１＿１）が０である情報テーブルが見つからなければ、ｎ＝−１とする。
【００４８】
ステップＳ５１では、ステップＳ５０で獲得したローカル変数ｎの値が−１であるか否かを判別する。ｎ＝−１の場合は、プリンタ情報テーブル３１に、使用できる空き情報テーブルが無いため、エラーとなり、格納処理を終了する。ｎ＝−１でなければ、ステップＳ５２に進む。
【００４９】
ステップＳ５２では、ｎをインデックスとする情報テーブル［ｎ］におけるメンバ（ａｃｔｉｖｅ  ３１＿１）を１にセットする。これによって、論理ユニット番号ＬＵＮがｎであるプリンタが使用中であることを示すことができる。
【００５０】
ステップＳ５３では、接続プリンタのプリンタ種別を判別する。さらに、その種別ごとにコマンドネゴシエーションを行い、接続プリンタのステータスデータのサイズの最大値を得る。この値をローカル変数ｓｉｚｅとする。
【００５１】
なお、プリンタ種別が不明であるプリンタや、ステータスデータを返却しないプリンタであった場合は、ローカル変数ｓｉｚｅを０に設定する。
【００５２】
ステップＳ５４では、ローカル変数ｓｉｚｅの値が０であるか否かを判別する。これが０の場合は、接続プリンタが、ステータスデータを返却しないプリンタか、プリンタ種別が不明であるプリンタであると判断できる。よってこの場合ステップＳ５５に進み、インデックスｎの情報テーブル［ｎ］におけるメンバ（ｉｎｔｅｒｖａｌ  ３１＿２）に０を設定して、接続プリンタのステータス取得周期を０（取得しない）にする。そして、ステップＳ５８にジャンプする。
【００５３】
ステップＳ５４で、ローカル変数ｓｉｚｅの値が０ではない、すなわち、接続プリンタがステータスデータを返却できるプリンタであると判別された場合は、ステップＳ５６に進む。ステップＳ５６では、ローカル変数ｓｉｚｅと同じ値の記憶容量を有するプリンタステータスバッファ３２をメモリ１２内に確保し、そのプリンタステータスバッファ３２のメモリ１２内の位置を示すポインタを、インデックスｎの情報テーブル［ｎ］におけるメンバ（ｂｕｆ  ３１＿３）に格納する。
【００５４】
ステップＳ５７では、インデックスｎの情報テーブル［ｎ］におけるメンバ（ｉｎｔｅｒｖａｌ  ３１＿２）に、デフォルトのプリンタ取得周期（例えば、２０００ｍｓ）をセットする。この値は、アプリケーションプログラムからのシステムコールによって変更することができる。
【００５５】
ステップＳ５８では、確保したプリンタステータスバッファ３２のサイズを、インデックスｎの情報テーブル［ｎ］におけるメンバ（ｓｉｚｅ  ３１＿４）に格納する。ステップＳ５５からステップＳ５８に至った場合は、０を格納する。
【００５６】
図６は、アプリケーションプログラムからのシステムコールによって実行される非同期プリンタステータス取得設定処理の手順を示すフローチャートである。
【００５７】
アプリケーションプログラムは、プリンタステータスを格納するための新たなプロセス情報構造体を確保する一方、システムコールによって実行されるプロセスのプロセスＩＤ、ステータスデータの格納が完了したときに、その旨をデバイスドライバがアプリケーションプログラムに通知するためのシグナル値、ステータスデータを格納するためのアプリケーションプログラム指定のバッファのメモリ１２内の位置を示すポインタ、及びプリンタステータス取得周期をデバイスドライバに通知する。
【００５８】
図６におけるステップＳ６０では、メモリ１２に新たなプロセス情報構造体を確保するとともに、メモリ１２における該新たなプロセス情報構造体の位置を示すポインタをローカル変数ｐｔｒに格納する。
【００５９】
ステップＳ６１では、アプリケーションプログラムがオープンしているデバイスハンドルからプリンタ情報テーブル３１のインデックスｎを得る。すなわち通常、ＯＳが提供しているデバイスハンドルから論理ユニット番号ＬＵＮを取得することができ、これがプリンタ情報テーブル３１のインデックスに対応する。
【００６０】
ステップＳ６２では、プロセス情報リンクリストの最後の位置を検索し、ステップＳ６３で確保された新たなプロセス情報構造体を、その最後の位置に追加する。すなわち、新たなプロセス情報構造体のメモリ１２における位置を示すポインタ（ローカル変数ｐｔｒ）を、最後のプロセス情報構造体のメンバ（ｎｅｘｔ  ２２＿５）に格納する。
【００６１】
ステップＳ６４では、アプリケーションプログラムから通知されたプロセスＩＤ、シグナル値、及び指定バッファのポインタを、新たなプロセス情報構造体の対応するメンバに設定する。すなわち、プロセスＩＤをメンバ（ｐｒｏｃｅｓｓ＿ｉｄ  ２２＿１）に、シグナル値をメンバ（ｓｉｇｎａｌ  ２２＿２）に、ポインタをメンバ（ｕ＿ｂｕｆｆｅｒ  ２２＿３）に格納する。
【００６２】
なお、アプリケーションプログラムから通知されたプリンタステータス取得周期の値が０以外の場合は、プリンタ情報テーブル３１のインデックスｎの情報テーブルにおけるメンバ（ｉｎｔｅｒｖａｌ  ３１＿２）にその値を設定する。通知された値が０の場合は、デフォルト指定とみなして設定しないようにする。
【００６３】
ステップＳ６５では、プリンタ情報テーブル３１のインデックスｎの情報テーブルにおけるメンバ（ｐｒｏｃｅｓｓ＿ｉｎｆｏ  ３１＿５）に、ローカル変数ｐｔｒ（新たなプロセス情報構造体の位置を示すポインタ）をセットする。
【００６４】
ステップＳ６６では、アプリケーションプログラムから通知されたプリンタステータス取得周期でプリンタステータス取得を実行するために、プリンタステータス取得関数＿ｎをＯＳの提供する周期実行関数として登録する。ＯＳはこの登録されたプリンタステータス取得関数＿ｎを、登録されたプリンタステータス取得周期で実行する。
【００６５】
図７は、図６のステップＳ６６でＯＳに登録された周期実行関数であるプリンタステータス取得関数＿ｎの処理の手順を示すフローチャートである。
【００６６】
このプリンタステータス取得関数＿ｎは、ＯＳにより周期的に実行される。プリンタステータス取得関数＿ｎは、接続されたプリンタの論理ユニット番号ＬＵＮごとに起動される。よってプリンタステータス取得関数＿ｎは、自身の担当するプリンタのＬＵＮ（＝ｎ）がわかっている。
【００６７】
ステップＳ７０では、デバイスドライバが、接続プリンタのステータスデータを取得し、該ステータスデータを、プリンタ情報テーブル３１のインデックスｎの情報テーブルにおけるメンバ（ｂｕｆ  ３１＿３）に格納されたポインタで示されるプリンタステータスバッファ３２に格納する。そして、取得したステータスデータのサイズを、ローカル変数ｒｓｉｚｅに設定する。
【００６８】
ステップＳ７１では、プリンタ情報テーブル３１のインデックスｎの情報テーブルにおけるメンバ（ｐｒｏｃｅｓｓ＿ｉｎｆｏ  ３１＿５）に格納されている新たなプロセス情報構造体のポインタ値を、ローカル変数ｐｔｒに設定する。
【００６９】
ステップＳ７２では、ローカル変数ｐｔｒに対応する新たなプロセス情報構造体におけるメンバ（ｕ＿ｂｕｆｆｅｒ  ２２＿３）にポインタが格納されたアプリケーションプログラム指定のバッファに、ステップＳ７０で取得したプリンタステータスデータをコピーする。さらに、ローカル変数ｐｔｒに対応する新たなプロセス情報構造体におけるメンバメンバ（ｒｅａｄ＿ｓｉｚｅ  ２２＿４）に、取得したステータスデータのサイズを示すローカル変数ｒｓｉｚｅを格納する。
【００７０】
ステップＳ７３では、デバイスドライバがアプリケーションプログラムに対して、プリンタステータスの取得完了を通知するために、ローカル変数ｐｔｒに対応する新たなプロセス情報構造体におけるメンバ（ｓｉｇｎａｌ  ２２＿２）に格納されたシグナル値を、ローカル変数ｐｔｒに対応する新たなプロセス情報構造体におけるメンバ（ｐｒｏｃｅｓｓ＿ｉｄ  ２２＿１）にプロセスＩＤが格納されたステータス取得プロセスに対して送信する。
【００７１】
ステップＳ７４では、プリンタ情報テーブル３１のインデックスｎの情報テーブルにおけるメンバ（ｂｕｆ  ３１＿３）に格納されたポインタで示されるプリンタステータスバッファ３２を０クリアする。これは、該バッファの中に不要なデータが残ることを避けるためである。
【００７２】
以上のようにして、アプリケーションプログラムは、ｒｅａｄシステムコールを発行しなくても、指定したプリンタステータス取得周期でプリンタステータスをデバイスドライバから取得することが可能となる。
【００７３】
なお、本実施の形態では、一般的なＵＮＩＸ（登録商標）系のＯＳを想定しているため、デバイスドライバが、ＰＯＳＩＸシグナルを使用してアプリケーションプログラムへステータスデータ取得完了の通知を行っているが、ＯＳの種類によってはＰＯＳＩＸシグナルではなく、イベント／メッセージや、それに類似する手段を用いて該通知を行なうようにしてもよい。
【００７４】
〔第２の実施の形態〕
次に、本発明の第２の実施の形態を説明する。
【００７５】
第２の実施の形態の構成は、基本的に第１の実施の形態の構成と同じであるので、第２の実施の形態の説明においては、第１の実施の形態の構成と同一部分には同一の参照符号を付して、第１の実施の形態の説明を流用し、異なる部分だけを説明する。
【００７６】
第２の実施の形態では、アプリケーションプログラムが新規システムコールを発行し、印刷データの出力プロセスとステータス取得プロセスとを同時に実行する。
【００７７】
この新規システムコールは、印刷出力データのアドレス（メモリ１２内の保存位置）／データサイズと、デバイスステータスを格納するためのバッファアドレス（メモリ１２内のバッファ位置）／バッファサイズとを引数にもつシステムコール（例えば、wr_and_read(char *wbuf, unsinged int *wsize, char *rbuf, unsigned int *rsize)）であり、実際にプリンタに出力された印刷データのサイズおよび取得されたステータスデータのサイズは、引数の＊ｗｓｉｚｅ／＊ｒｓｉｚｅにセットされる。
【００７８】
これを実現するため、デバイスドライバは、指定された印刷データを出力後、プリンタからステータスデータを取得し、＊ｒｂｕｆで指定されるメモリ１２の位置に格納する。そして、実際にプリンタに出力された印刷データのサイズおよび取得されたステータスデータのサイズを、引数の＊ｗｓｉｚｅ及び＊ｒｓｉｚｅにセットする。
【００７９】
ただし、印刷データ出力プロセスがブロックされることを想定して、ＯＳに対してタイムアウト時間を設定する。こうすることで、ステータス取得プロセスが長時間実行されない問題を回避する。
【００８０】
アプリケーションプログラムは、上記システムコールにより印刷データの出力とステータスデータの取得とが一度に行えることに加え、その瞬間のデバイスステータスが得られるので、きめ細かい制御が可能となる。
【００８１】
図８は、アプリケーションプログラムがデータ出力プロセスとステータス取得プロセスとを同時に実行することを実現する同期リードライト処理の手順を示すフローチャートである。
【００８２】
ステップＳ８０では、ＯＳに対して、続いて行われるデータ出力処理のためのタイムアウト時間を設定する。すなわち、続いて行われるデータ出力処理の進行が、このタイムアウト時間に亘って停止した場合に、ＯＳがデータ出力処理を中断するために、このタイムアウト時間を設定する。
【００８３】
ステップＳ８１では、アプリケーションプログラムから指定された印刷データ（ｗｂｕｆで指定されるメモリ１２内の位置に保持される）をプリンタに対して出力する。プリンタへの出力に成功した場合は、プリンタへ出力された印刷データのサイズをローカル変数ｗｒｉｔｔｅｎに設定する。
【００８４】
ステップＳ８２では、ステップＳ８１での出力処理がタイムアウト時間内に正常に終了したか否かを確認する。出力処理がタイムアウト時間内に正常に終了せず、タイムアウトが発生した場合は、ステップＳ８３に進んで、ローカル変数ｗｒｉｔｔｅｎを０にする。タイムアウトが発生しない場合は、ステップＳ８３をスキップしてステップＳ８４に進む。
【００８５】
ステップＳ８４では、アプリケーションプログラムがオープンしているデバイスハンドルから、プリンタ情報テーブル３１のインデックスｎを得る。通常、ＯＳが提供しているデバイスハンドルから論理ユニット番号ＬＵＮを取得することができ、該論理ユニット番号ＬＵＮは、プリンタ情報テーブル３１のインデックスに対応する。
【００８６】
ステップＳ８５では、接続プリンタからプリンタステータスを取得し、プリンタ情報テーブル３１のインデックスｎの情報テーブルにおけるメンバ（ｂｕｆ  ３１＿３）に格納されたポインタで示されるプリンタステータスバッファ３２に、取得したプリンタステータスを格納する。また、取得したプリンタステータスのデータサイズをローカル変数ｒｅａｄに設定する。なお、プリンタステータスの取得に失敗した場合は、ローカル変数ｒｅａｄに０を設定する。
【００８７】
ステップＳ８６では、ステップＳ８５でプリンタステータスバッファ３２に格納されたプリンタステータスを、アプリケーションプログラムの指定バッファ（ｒｂｕｆで指定されるメモリ１２内の位置に保持される）にコピーする。ステップＳ８５でプリンタステータスの取得に失敗した場合は、コピーしない。
【００８８】
ステップＳ８７では、プリンタへ出力された印刷データのサイズを示すローカル変数ｗｒｉｔｔｅｎを、ｗｓｉｚｅで指定されたメモリ１２内の位置に格納するとともに、取得したプリンタステータスのデータサイズを示すローカル変数ｒｅａｄを、ｒｓｉｚｅで指定されたメモリ１２内の位置に格納し、これによって、プリンタへ出力された印刷データのサイズ及び取得したプリンタステータスのデータサイズを、アプリケーションプログラムに通知する。
【００８９】
以上のように、第２の実施の形態では、アプリケーションプログラムが、一度のシステムコールによって印刷データの出力とステータスの取得とが可能となる。よって、アプリケーションプログラムの設計が簡略化できるとともに、システムコールの発生頻度が減るので、印刷処理のスループットを向上することができる。
【００９０】
なお、デバイスドライバは、通常のｒｅａｄシステムコールによるステータス取得プロセスもサポートする。その場合、デバイスドライバは、アプリケーションプログラムからのｒｅａｄ要求を受けると、デバイスステータスを取得し、指定されたバッファに格納するようにする。
【００９１】
〔他の実施の形態〕
上記各実施の形態では、情報処理装置と外部機器とが直結されているが、これに代わって、情報処理装置と外部機器とがネットワークを介して接続されている場合でも、本発明を適用することができることは言うまでも無い。
【００９２】
また、情報処理装置に接続される外部機器は、プリンタの他、リード／ライトをしながらデータ入出力を実行する外部機器、例えばスキャナ、デジタルカメラ、ビデオカメラなどであってもよい。
【００９３】
なおまた、本発明の目的は、前述した各実施の形態の機能を実現するソフトウェアのプログラムコードを記録した記憶媒体を、システムまたは装置に供給し、そのシステムまたは装置のコンピュータ（またはＣＰＵ、ＭＰＵ等）が記憶媒体に格納されたプログラムコードを読み出して実行することによっても達成される。
【００９４】
この場合、記憶媒体から読み出されたプログラムコード自体が本発明の新規な機能を実現することになり、そのプログラムコードを記憶した記憶媒体およびプログラムは本発明を構成することになる。
【００９５】
また、プログラムコードを供給するための記憶媒体としては、例えば、フレキシブルディスク、ハードディスク、光ディスク、光磁気ディスク、ＣＤ−ＲＯＭ、ＣＤ−Ｒ、ＣＤ−ＲＷ、ＤＶＤ−ＲＯＭ、ＤＶＤ−ＲＡＭ、ＤＶＤ−ＲＷ、ＤＶＤ＋ＲＷ、磁気テープ、不揮発性のメモリカード、ＲＯＭ等を用いることができる。
【００９６】
また、コンピュータが読み出したプログラムコードを実行することにより、前述した各実施の形態の機能が実現されるだけでなく、そのプログラムコードの指示に基づき、コンピュータ上で稼動しているＯＳ（オペレーティングシステム）等が実際の処理の一部または全部を行い、その処理によって前述した各実施の形態の機能が実現される場合も含まれる。
【００９７】
更に、記憶媒体から読み出されたプログラムコードが、コンピュータに挿入された機能拡張ボードやコンピュータに接続された機能拡張ユニットに備わるメモリに書き込まれた後、そのプログラムコードの指示に基づき、その機能拡張ボードや機能拡張ユニットに備わるＣＰＵ等が実際の処理の一部または全部を行い、その処理によって前述した各実施の形態の機能が実現される場合も含まれる。
【図面の簡単な説明】
【００９８】
【図１】第１の実施の形態に係る情報処理装置の構成を示すブロック図である。
【図２】図１に示す情報処理装置において、アプリケーションプログラムからデバイスドライバに対して、システムコールによってステータス取得に関連する各種の指定情報が送られたときに、その指定情報を保管管理するためのプロセス情報リンクリストを示す図である。
【図３】デバイスドライバによってメモリに格納管理され、接続プリンタごとのステータス取得情報を格納するテーブルを示す図である。
【図４】デバイスドライバによる初期化処理の手順を示すフローチャートである。
【図５】デバイスドライバによるプリンタ情報テーブルへの各種情報の格納処理の手順を示すフローチャートである。
【図６】アプリケーションプログラムからのシステムコールによって実行される非同期プリンタステータス取得設定処理の手順を示すフローチャートである。
【図７】図６のステップＳ６６でＯＳに登録された周期実行関数であるプリンタステータス取得関数＿ｎの処理の手順を示すフローチャートである。
【図８】アプリケーションプログラムがデータ出力プロセスとステータス取得プロセスとを同時に実行することを実現する同期リードライト処理の手順を示すフローチャートである。
【符号の説明】
【００９９】
１１  ＣＰＵ（受取手段、取得手段、格納手段）
１２  メインメモリ
１３  ＤＭＡ（Direct Memory Access）
１４  外部接続ポート群
１５  外部デバイス（外部装置）
２１  プロセス情報ヘッダ
２２〜２４  プロセス情報構造体
３１  プリンタ情報テーブル
３２  プリンタステータスバッファ
【図１】
2005309511.tif 000003
【図２】
2005309511.tif 000004
【図３】
2005309511.tif 000005
【図４】
2005309511.tif 000006
【図５】
2005309511.tif 000007
【図６】
2005309511.tif 000008
【図７】
2005309511.tif 000009
【図８】
2005309511.tif 000010