ioctl() - 装置の制御

標準

標準/拡張機能 C/C++ 依存項目

XPG4.2
Single UNIX Specification、バージョン 3

両方  

形式

端末:
#include <sys/ioctl.h>

int ioctl(int fildes int cmd, ... /* arg */);
ソケット:
#define _XOPEN_SOURCE_EXTENDED 1

/**     OR      **/

#define _OE_SOCKETS

#include <sys/ioctl.h>
#include <net/rtrouteh.h>
#include <net/if.h>
int ioctl(int fildes, int cmd, ... /* arg */);
STREAMS:
#define _XOPEN_SOURCE_EXTENDED 1
#include <stropts.h>
int ioctl(int fildes int cmd, ... /* arg */);

機能説明

ioctl() は、装置上でさまざまな制御関数を実行します。cmd 引数と任意指定の 3 番目の引数 (さまざまなタイプ) が、fildes に対応する装置に渡されて、変換されます。

cmd 引数は、実行される制御関数を選択し、アドレスされる装置に依存します。

arg 引数は、この特定の装置が要求された関数を実行するために必要とする追加の情報を表します。arg のタイプは、特定の制御要求に依存しますが、整数または装置特定のデータ構造へのポインターです。

ioctl() の情報は、以下の トピックに分けられます。
  • 端末
  • ソケット
  • STREAMS
  • ACL

端末

端末では以下の ioctl() コマンドが使用されます。
コマンド
説明
TIOCSWINSZ
ウィンドウ・サイズを設定します。端末に対する ioctl() の 2 番目のオペランドとして使用されます。3 番目のオペランドによって指定されるウィンドウ・サイズ情報が カーネル内の端末に関連付けられる領域にコピーされ、SIGWINCH シグナルがフォアグラウンドのプロセス・グループに対して生成されます。
TIOCGWINSZ
ウィンドウ・サイズを取得します。端末に対する ioctl() の 2 番目のオペランドとして使用されます。3 番目のオペランドである winsize 構造によって指定される領域に、現在のウィンドウ・サイズが戻されます。
winsize 構造は、TIOCSWINSZ または TIOCGWINSZ を使用する場合、ioctl() 呼び出しの 3 番目のオペランドになります。この構造は、4 つの符号なし短 整数をとります。
フィールド
説明
ws_row
ウィンドウ内の行数を文字で示したもの。
ws_col
ウィンドウ内の列数を文字で示したもの。これは、1 バイト文字を想定しています。マルチバイト文字は、より多くの空間を取ります。
ws_xpixel
ウィンドウの横サイズをピクセルで示したもの。
ws_ypixel
ウィンドウの縦サイズをピクセルで示したもの。

ソケット

ソケットでは以下の ioctl() コマンドが使用されます。
コマンド
説明
FIONBIO
ソケットに対する非ブロック I/O を設定またはクリアします。arg は整数へのポインターです。整数が 0 の場合、ソケット上への非ブロック I/O がクリアされます。それ以外の場合、ソケットは非ブロック I/O に設定されます。
FIONREAD
ソケットに対して、ただちに読み取り可能なバイト数を取得します。arg は整数へのポインターです。整数の値を、ソケットでただちに読み取り可能な文字数に設定します。
FIONWRITE
接続されたピア AF_UNIX ストリーム・ソケットに書き込み可能 (そのソケットが EWOULDBLOCK をブロックするか、または戻す前に) なバイト数を戻します。戻されるバイト数は、使用するアプリケーションによるシリアライゼーションがない場合、保証されません。
FIOGETOWN
シグナルの受信者を指定するために設定された PID を戻します。
FIOSETOWN
シグナルを送信するときに使用される PID を設定します。

FIOGETOWN および FIOSETOWN は、fctl() の F_GETOWN および F_SETOWN コマンドと同等です。pid の値についての詳細は、この関数を参照してください。この関数は、AF_INET ストリーム・ソケットに対してのみ有効です。

SECIGET
AF_UNIX 接続のストリーム・ソケットについて、対等ソケットのセキュリティー識別値を取得します。対等プロセスの MVS™ ユーザー ID、有効な UID、および有効な GID が、BPXYSECI によってマップされる seci 構造に戻されます。 このオプションが有効なのは、AF_UNIX ドメインの場合のみです。
SECIGET_T
この両方のプロセスを戻し、このソケットに接続された AF_UNIX ストリームに対するピアの、タスク・レベル・セキュリティー情報 (使用可能であれば) を戻します。 このタスク・レベル・セキュリティー情報は、connect() または accept() を実行するタスクから入手します。セキュリティー情報は、<sys/ioctl.h> で定義されている struct __sect_s の中に戻されます。このセキュリティー情報は、accept() が完了してから使用可能になります。ピアのタスク・レベル・セキュリティー・データが使用可能かどうかは、タスク・レベルのユーザー ID の長さフィールドで判別されます。 ゼロの場合、このピアにはタスク・レベル・セキュリティー・データがありません。
SIOCADDRT
ルーティング・テーブルにエントリーを追加します。arg は、<net/rtrouteh.h> 内で定義されている、rtentry 構造へのポインターです。引数として渡されるルーティング・テーブルのエントリーが、ルーティング・テーブルに追加されます。このオプションは、AF_INET ドメインの場合にのみ有効です。
SIOCATMARK
データ入力内の現在の位置が、バンド外のデータを指していないかどうか照会します。arg は整数へのポインターです。SIOCATMARK は、ソケットが、バンド外のデータのデータ・ストリーム内のマークを指している場合、引数を 1 に設定します。それ以外の場合、引数は 0 に設定されます。バンド外のデータの受信についての詳細は、recv()、recvfrom()、および recvmsg() を参照してください。
SIOCDELRT
ルーティング・テーブルのエントリーを削除します。arg は、<net/rtrouteh.h> 内で定義されている、rtentry 構造へのポインターです。引数として渡されたルーティング・テーブルのエントリーが存在する場合、ルーティング・テーブルから削除されます。このオプションは、AF_INET ドメインの場合にのみ有効です。
SIOCGIFADDR

ネットワーク・インターフェース・アドレスを取得します。arg は、<net/if.h> で定義される、ifreq 構造へのポインターです。 インターフェース・アドレスが、引数に戻されます。このオプションは、AF_INET ドメインの場合にのみ有効です。

このマクロは、_OPEN_SYS_IF_EXT フィーチャーによって保護されます。

SIOCGIFBRDADDR

ネットワーク・インターフェース・ブロードキャスト・アドレス を取得します。arg は、<net/if.h> で定義される、ifreq 構造へのポインターです。 インターフェース・ブロードキャスト・アドレスが、引数に戻されます。このオプションは、AF_INET ドメインの場合にのみ有効です。

このマクロは、_OPEN_SYS_IF_EXT フィーチャーによって保護されます。

SIOCGIFCONF

ネットワーク・インターフェース構成を取得します。arg は、<net/if.h> 内で定義されている ifconf 構造へのポインターです。インターフェース構成は、ifconf 構造によって指定されるバッファーに戻されます。戻されたデータの長さが、前にバッファーの長さが含まれていたフィールドに戻されます。このオプションは、AF_INET ドメインの場合にのみ有効です。

このマクロは、_OPEN_SYS_IF_EXT フィーチャーによって保護されます。

SIOCGIFCONF6
名前、アドレス、および構成される IPv6 ネットワーク・インターフェースに関するその他の情報を入手します。 これは、IPv4 に対する SIOCGIFCONF コマンドと同様です。

OSM インターフェースを要求するには、アプリケーションが EZB.OSM.sysname.tcpname リソースに対する読み取り権限を持っている必要があります。

struct __net_ifconf6header_s は、ioctl の引数として受け渡されます。この構造体は、構成情報が書き込まれるべき場所、および各 struct と出力バッファーに書き込まれた __net_ifconf6entry_s のエントリー数およびエントリー長を使用して構成情報が戻される場所を指定します。 これらの構造体は、<sys/ioctl.h> で定義されます。

__nif6h_buflen および __nif6h_buffer が共にゼロの場合、照会関数が実行され、次のようにヘッダーが戻されます。

__nif6h_version
サポートされる最新のバージョン。
注: バージョン番号が提供される (非ゼロで) 場合、戻されるエントリー長は指定されたバージョンに対するものです。 (サポートされる場合)
__nif6h_entries
出力予定のエントリーの合計数。
__nif6h_entrylen
個別のエントリー長。
情報を入手するための呼び出しが、以下のいずれかで失敗した場合:
errno = ERANGE, or
errno = EINVAL and __nif6h_version has changed
この呼び出しは照会関数に変換され、ヘッダーは上記のように書き込まれています。 これらの場合、出力バッファーの内容は不確定です。

共通の INET が構成され、複数の TCP/IP スタックがソケットに接続される場合、IPv6 に対して使用可能状態の各スタックからの出力は出力バッファーで連結され、ヘッダーには全スタックから戻されるエントリー総数が入ります。 照会関数を使用して戻されるバージョンは、すべてのスタックがサポートする最新バージョンです。

この ioctl は、AF_INET または AF_INET6 ソケットで実行可能です。

エラー・コード
説明
EAFNOSUPPORT
IPv6 を対象とする TCP/IP スタックは、どれもアクティブではありません。
EINVAL
この入力バージョン番号は、サポートされません。
ERANGE
バッファーが小さいため、IPv6 ネットワーク・インターフェースの全エントリーを収容できません。
SIOCGIFDSTADDR

ネットワーク・インターフェース宛先アドレスを取得します。arg は、<net/if.h> で定義される、ifreq 構造へのポインターです。 インターフェース宛先 (Point-to-Point) アドレスが、引数に戻されます。このオプションは、AF_INET ドメインの場合にのみ有効です。

このマクロは、_OPEN_SYS_IF_EXT フィーチャーによって保護されます。

SIOCGIFFLAGS

ネットワーク・インターフェース・フラグを取得します。arg は、<net/if.h> で定義される、ifreq 構造へのポインターです。 インターフェース・フラグが引数に戻されます。このオプションは、AF_INET ドメインの場合にのみ有効です。

このマクロは、_OPEN_SYS_IF_EXT フィーチャーによって保護されます。

SIOCGIFMETRIC

ネットワーク・インターフェース・ルーティング・メトリックを取得します。arg は、<net/if.h> で定義される、ifreq 構造へのポインターです。 インターフェース・ルーティング・メトリックが、引数に戻されます。このオプションは、AF_INET ドメインの場合にのみ有効です。

このマクロは、_OPEN_SYS_IF_EXT フィーチャーによって保護されます。

SIOCGIFMTU

ネットワーク・インターフェース MTU (最大伝送単位) を取得します。 arg は、<net/if.h> 内で定義されている ifreq 構造へのポインターです。インターフェース MTU が引数 arg->ifr_mtu に戻されます。このオプションは、AF_INET ドメインの場合にのみ有効です。

このマクロは、_OPEN_SYS_IF_EXT フィーチャーによって保護されます。

SIOCGIFNETMASK

ネットワーク・インターフェース・ネットワーク・マスクを取得します。arg は、<net/if.h> で定義される、ifreq 構造へのポインターです。 インターフェース・ネットワーク・マスクが、引数に戻されます。このオプションは、AF_INET ドメインの場合にのみ有効です。

このマクロは、_OPEN_SYS_IF_EXT フィーチャーによって保護されます。

SIOCGSPLXFQDN
指定されているサーバーの完全修飾ドメイン・ネーム、およびシスプレックス内のドメイン・ネームを取得します。これは特殊な目的のコマンドであり、ドメイン・ネーム・システム (DNS) による接続最適化サービス用のワークロード・マネージャー (WLM) を使用して登録されたアプリケーションをサポートします。arg' は、<ezbzsdnc.h> で定義されている sysplexFqDn 構造体へのポインターです。sysplexFqDn には、<ezbzsdnc.h> で定義されている sysplexFqDnData 構造体へのポインターが入っています。

sysplexFqDnData 構造体には、サーバー名 (入力)、グループ名 (入力)、および完全修飾ドメイン名 (出力) が入っています。

SIOCGSPLXFQDN コマンドを指定している ioctl() は、次の場合に失敗します。
エラー・コード
説明
EFAULT
ユーザー・ストレージの書き込みに失敗
EINVAL
以下のいずれかです。
  • グループ名が必要
  • バッファー長が無効
  • ソケット呼び出しパラメーター・エラー
ENXIO
以下のいずれかです。
  • シスプレックス・アドレスが見つからない
  • Res が DNS に見つからない
  • タイムアウト
  • 時刻の予期しないエラー
例: SIOCGSPLXFQDN を指定した ioctl() の例を、次に示します。
  #include <ezbzsdnc.h>
      sysplexFqDn        splxFqDn;
      sysplexFqDnData    splxData;
      int                rc;

      splxFqDn.splxVersion = splxDataVersion;
      splxFqDn.splxBufLen  = sizeof(sysplexFqDnData);
      splxFqDn.splxBufAddr = &splxData;

      /*  Assign values to splxData.groupName, */
      /*  splxData.serverName if required      */
          .
          .

      /* Get the fully qualified domain name   */
      rc = ioctl(s,SIOCGSPLXFQDN, (char *) &splxFqDn);

      /* splxData.domainName contains the fully*/
      /* qualified domain name.                */
SIOCSECENVR

サーバー・ソケットに対して、セキュリティー環境を SET または GET するのに使用されます。 arg は struct __seco_s を示します。ここで、エレメント __seco_argument は、SET 要求に対しては 1 に、GET 要求に対しては 2 に設定されます。

SET 引数を指定時は、AF_UNIX ストリーム・ソケット・サーバーは、接続するクライアントの完全なセキュリティー環境を必要とするものとしてこのサーバー・ソケットを指定して、この接続の正常完了前に使用可能になるようにします。 接続処理時に、接続はコネクターのセキュリティー環境を入手し、このコネクターのソケットから、そのコネクターがアンカーされた状態を解除して、サーバーが使用できるようにします。 接続処理の間にセキュリティー環境を入手できない場合、その接続は失敗します。このコマンドは、サーバー・ソケットにならないソケットに影響しません。

GET 引数を指定時は、AF_UNIX ストリーム・ソケット・サーバーは、コネクターのアドレス・スペースからサーバーのアドレス・スペースへ、事前に SET されたセキュリティー環境をコピーします。これにより、セキュリティー製品への呼び出しの際に入力として使用できるようになります。 このコマンドが意味を持つのは、以前に SET 引数指定で SIOCSECENVR を実行したサーバー・ソケットに対してのみです。

SIOCSIFMETRIC

ネットワーク・インターフェース・ルーティング・メトリックを設定します。arg は、<net/if.h> で定義される、ifreq 構造へのポインターです。 SIOCSIFMETRIC は、インターフェース・ルーティング・メトリックを引数として渡された値に設定します。このオプションは、AF_INET ドメインの場合にのみ有効です。

このマクロは、_OPEN_SYS_IF_EXT フィーチャーによって保護されます。

SIOCSPARTNERINFO
接続のセットアップ時にパートナーのセキュリティー資格情報を取得するための標識を設定し、情報を保管して、アプリケーションが、そのアプリケーション自体を中断することなく SIOCGPARTNERINFO ioctl を発行できるようにするか、少なくとも情報を取得するための時間を最小にします。SIOCSPARTNERINFO ioctl は、SIOCGPARTNERINFO ioctl の前に発行されなければなりません。詳細は、「」を参照してください。z/OS V2R2.0 Communications Server: IP Programmer's Guide and Reference.
SIOCSVIPA
IPv4 動的 VIPA を定義または削除します。arg は、<ezbzdvpc.h> で定義されている dvreq 構造体へのポインターです。このオプションは、AF_INET ドメインの場合にのみ有効です。
SIOCSVIPA6
IPv6 動的 VIPA を定義または削除します。arg は、<ezbzdvpc.h> で定義されている dvreq6 構造体へのポインターです。 このオプションが有効なのは、AF_INET6 ドメインの場合のみです。
SIOCTIEDESTHRD
記述子をスレッドに関連付ける (結合) か、またはスレッドから切り離し (分離) ます。 arg は、整数へのポインターです。*arg が 1 のとき、この記述子は呼び出し元のスレッドに結合します。 *arg が 0 のとき、この記述子は呼び出し元のスレッドから分離します。 この記述子のクローズ前またはタスクからの分離前にタスクを終了させる必要がある場合、z/OS UNIX ファイル・システムのスレッド終了処理により、その記述子がクローズされます。 このコマンドは、負荷が大きなスレッドと中程度スレッドで使用可能です。

C++ の特殊な動作: C++ でこの関数を使用するには、_XOPEN_SOURCE_EXTENDED 1 フィーチャー・テスト・マクロを 使用する必要があります。

端末とソケットの戻り値

正常に実行された場合、ioctl() は 0 を戻します。

正常に実行されなかった場合、ioctl() は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
EBADF
fildes パラメーターが無効ソケット記述子です。
EINVAL
要求が無効か、またはサポートされていません。
EIO
関数を発行するプロセスのプロセス・グループは孤立した バックグラウンド・プロセス・グループで、関数を発行する プロセスは SIGTTOU を無視またはブロックしていません。
EMVSPARM
無効なパラメーターがサービスに渡されました。
ENODEV
装置が正しくありません。この関数は装置ドライバーによってサポートされません。
ENOTTY
正しくないファイル記述子が指定されました。ファイル・タイプが特殊な文字ではありません。

ioctl() 呼び出しの例を次に示します。
int s;
int dontblock;
int rc;
⋮
/* Place the socket into nonblocking mode */
dontblock = 1;
rc = ioctl(s, FIONBIO, (
char *) &dontblock);
⋮

STREAMS

STREAMS では次の ioctl() コマンドが使用されます。
L_PUSH
arg が指す名前のモジュールを、現在の STREAM の最上部、STREAM ヘッドのすぐ下にプッシュします。それから、新しくプッシュされたモジュールに対して、open() 関数を呼び出します。
I_PUSH コマンドを指定している ioctl() は、次の場合に失敗します。
エラー・コード
説明
EINVAL
モジュール名が無効。
ENXIO
新しいモジュールのオープン関数が失敗。
ENXIO
fildes でハングアップを受信。
L_POP
fildes が指す STREAM のすぐ下にあるモジュールを除去します。arg 引数は、I_POP 要求では 0 でなくてはいけません。
I_POP コマンドを指定している ioctl() は、次の場合に失敗します。
エラー・コード
説明
EINVAL
STREAM 内にモジュールがない。
ENXIO
fildes でハングアップを受信。
L_LOOK
fildes が指す STREAM ヘッドのすぐ下にあるモジュール名を検索し、arg が指す文字ストリングをその場所に置きます。 arg が指すバッファーは、FMNAMESZ+1 バイト以上の長さが必要です (FMNAMESZ は、<stropts.h> で定義されています)。
I_LOOK コマンドを指定している ioctl() は、次の場合に失敗します。
エラー・コード
説明
EINVAL
STREAM 内にモジュールがない。
L_FLUSH
この要求は、arg の値に従って、読み取りと書き込みキューのいずれかまたは両方をフラッシュします。arg の値として適切なものは 以下のとおりです。
FLUSHR
すべての読み取りキューをフラッシュする。
FLUSHW
すべての書き込みキューをフラッシュする。
FLUSHRW
すべての読み取りおよび書き込みキューをフラッシュする。
I_FLUSH コマンドを指定している ioctl() は、次の場合に失敗します。
エラー・コード
説明
EAGAIN または ENOSR
フラッシュ・メッセージ用のバッファーが割り振れない。
EINVAL
arg の値が無効。
ENXIO
fildes でハングアップを受信。
I_FLUSHBAND
特定のバンドのメッセージをフラッシュします。arg 引数は、bandinfo 構造を指します。bi_flag メンバーは、上記の FLUSHER、FLUSHW、または FLUSHRW のいずれかになります。bi_pri メンバーが、フラッシュされるバンドの優先順位を決定します。
I_SETSIG
fildes に関連付けられた STREAM 上で特定のイベントが起きた場合、SIGPOLL シグナルを 呼び出し側のプロセスへ送信するよう、STREAMS のインプリメンテーションに要求します。I_SETIG は、STREAMS 内での非同期処理をサポートします。arg の値は、プロセスがシグナルを受ける必要のあるイベントを指定する ビット・マスクです。以下の任意の定数をビット単位 OR で組み合わせたものです。
S_RDNORM
STREAM ヘッド読み取りキューの先頭に、通常の (優先順位バンドが 0 に設定された) メッセージが 届いた。メッセージの長さがゼロでも、シグナルが生成される。
S_RDBAND
STREAM ヘッド読み取りキューの先頭に、ゼロ以外の優先順位バンドを持つメッセージが 届いた。メッセージの長さがゼロでも、シグナルが生成される。
S_INPUT
STREAM ヘッド読み取りキューの先頭に、優先順位の高くないメッセージが 届いた。メッセージの長さがゼロでも、シグナルが生成される。
S_HIPRI
STREAM ヘッド読み取りキューの先頭に、優先順位の高いメッセージが存在する。メッセージの長さがゼロでも、シグナルが生成される。
S_OUTPUT
STREAM ヘッドのすぐ下の通常データ (優先順位バンド 0) 用の書き込みキューが、いっぱいではなくなった。これにより、プロセスは、キュー上に 通常のデータをダウンストリームに送信する (または書き込む) 余地があることを通知される。
S_WRNORM
S_OUTPUT と同じ。
S_WRBAND
STREAM ヘッドのすぐ下のゼロ以外の優先順位バンド用の書き込みキューが、いっぱいではなくなった。これにより、プロセスは、キュー上に 優先順位のあるデータをダウンストリームに送信する (または書き込む) 余地がないことを通知される。
S_MSG
STREAM ヘッド読み取りキューの前に、SIGPOLL シグナルを含んだ STREAM のシグナル・メッセージが届いた。
S_ERROR
STREAM ヘッドに、エラー条件の通知が届いた。
S_HANGUP
S_RDBAND と一緒に使用された場合、STREAM ヘッド読み取りキューの前に優先順位メッセージが届いたとき、SIGURG が SIGPOLL の代わりに生成される。

arg が 0 の場合、呼び出し側のプロセスが登録解除され、fildes に関連付けられた STREAM に対する SIGPOLL シグナルを受信できなくなります。

SIGPOLL シグナルの受信が必要なプロセスは、I_SETSIG を使って、シグナルの受信を明示的に登録しなければいけません。複数のプロセスが、同じ STREAM 上の 同じイベントについてシグナルを受信するよう登録した場合、イベントが発生したときにすべての プロセスにシグナルが送信されます。

I_SETSIG コマンドを指定している ioctl() は、次の場合に失敗します。
エラー・コード
説明
EAGAIN
シグナル要求を保管するためのリソースが不足。
EINVAL
arg の値が無効である。
EINVAL
arg の値が 0 であり、さらに呼び出し側のプロセスが SIGPOLL シグナルを受信するように登録されていない。
I_GETSIG
現在、呼び出し側のプロセスが SIGPOLL シグナルを送られるように登録しているイベントを戻します。イベントは、上記の I_SETSIG の説明で指定されているもので、arg が指す int 内のビット・マスクとして戻されます。
I_GETSIG コマンドを指定している ioctl() は、次の場合に失敗します。
エラー・コード
説明
EINVAL
プロセスが SIGPOLL シグナルを受信するように登録されていない。
I_FIND
この要求は、現在 STREAM 内にあるすべてのモジュールの名前と、arg が指す名前を比較して、その名前のモジュールが STREAM にある場合は 1、ない場合は 0 を戻します。
I_FIND コマンドを指定している ioctl() は、次の場合に失敗します。
エラー・コード
説明
EINVAL
arg に正しいモジュール名が設定されていない。
I_PEEK
この要求は、STREAM ヘッド読み取りキューにある最初のメッセージについての情報を、メッセージをキューから取り出さないで検索します。このコマンドは、メッセージをキューから除去しない点を除いて、getmsg() と似ています。arg 引数は、strpeek 構造を指します。

ctlbuf および databuf strbuf 構造内の maxlen メンバーは、それぞれ、検索する制御情報とデータ情報の両方または一方のバイト数に 設定される必要があります。flags メンバーは、getmsg() から getpmsg() で記述されているように RS_HIPRI または 0 にマークされます。例えば、プロセスがフラグを RS_HIPRI に設定した場合、I_PEEK は STREAM ヘッド読み取りキューにある 優先順位の高いメッセージだけを探します。

I_PEEK はメッセージが見つかった場合は 1、STREAM ヘッド読み取りキューに メッセージがなかった場合または RS_HIPFI がフラグ内に 設定されていて STREAM ヘッド読み取りキューに優先順位の高いメッセージ がなかった場合は 0 を戻します。メッセージの到着を待つことはしません。戻り値の中で、ctlbuf は制御バッファー内の情報、databuf はデータ・バッファー内の情報を示し、フラグには RS_HIPRI または 0 の値が含まれます。

I_SRDOPT
引数 arg の値を使って、読み取りモードを設定します。 読み取りモードは、read() で説明されています。arg のフラグとして適切なものは 以下のとおりです。
RNORM
バイト・ストリーム・モード (デフォルト)。
RMSGD
メッセージ削除モード。
RMSGN
メッセージ非削除モード。

RMSGD と RMSGN のビット単位包含 OR は、EINVAL を戻します。RNORM と、RMSGD または RMSGN のビット単位包含 OR により、デフォルトである RNORM が他のフラグで上書きされます。

さらに、arg 内の 以下のいずれかのフラグを設定することにより、STREAM ヘッドによる制御メッセージの扱いが変更されます。
RPROTNORM
STREAM ヘッド読み取りキューの前に、制御パートを含むメッセージがある場合、read() は EBADMSG で失敗する。
RPROTDAT
プロセスが read() を発行したとき、メッセージの制御パートをデータとして届ける。
RPROTDIS
プロセスが read() を発行したとき、メッセージの制御パートを削除し、デー タ部分を届ける。
I_SRDOPT コマンドを指定している ioctl() は、次の場合に失敗します。
エラー・コード
説明
EINVAL
arg 引数が無効である。
I_GRDOPT
上記の現在の読み取りモード設定を、引数 arg が指す int に戻します。 読み取りモードは、read() で説明されています。
I_NREAD
STREAM ヘッド読み取りキューにある最初のメッセージのデータ・パートのバイト数を数え、その値を arg が指す init に置きます。このコマンドからの戻り値は、STREAM ヘッド読み取りキューにあるメッセージの数です。例えば、arg に 0 が戻されても、ioctl() が 0 より大きい値を戻している場合は、キュー上で長さゼロのメッセージが次にあることを意味します。
I_FDINSERT
指定されたバッファーからメッセージを作成し、別の STREAM についての情報を追加して、メッセージをダウンストリームへ送信します。メッセージには、制御パート と任意のデータ・パートが含まれます。送信されるデータ・パートと制御パ ートは、以下に説明される別々のバッファーに置くことによって区別されます。arg 引数は、strfdinsert 構造を指します。

ctlbuf strbuf 構造内の len メンバーは、ポインターの大きさとメッセージと一緒に送信される制御情報のバイト数を 足したものに設定されていなくてはいけません。fildes メンバーは 他の STREAM のファイル記述子を指定し、ポインターとして使用できるように並べられて いる必要のある offset メンバーは、STREAM の終わりを解釈するポインターを I_FDINSERT が保管する制御バッファーの始めからの オフセットを指定します。databuf strbuf 構造内の len メンバーは、メッセージと一緒に送信されるデータ情報のバイト数、またはデータ・パー トを送らない場合は 0 に設定されていなくてはいけません。

flags メンバーは、作成されるメッセージのタイプを指定します。flags が 0 に設定されている場合は 通常のメッセージが作成され、RS_HIPRI に設定されている場合は、優先順位の高いメッセージが作成されます。優先 順位のないメッセージについては、内部のフロー制御条件のために STREAM 書き込みキューが いっぱいになった場合、I_FDINSERT はブロックします。優先順位の高いメッセージに対しては、この条件が起きても I_FDINSERT はブロックしません。優先 順位のないメッセージについては、書き込みキューが いっぱいで O_NONBLOCK が設定されている場合、I_FDINSERT はブロックしません。 そのかわり、errno に EAGAIN を設定して失敗します。

また、I_FDINSERT は、内部リソースの不足によって妨げられない限り、優先順位または O_NONBLOCK が指定されているかどうかにかかわらず、STREAM 内のメッセージ・ ブロックが使用可能になるのを待つためにブロックします。部分メッセージは送信されません。

I_FDINSERT コマンドを指定している ioctl() は、次の場合に失敗します。
エラー・コード
説明
EAGAIN
優先順位のないメッセージが指定され、O_NONBLOCK フラグが設定されており、内部のフロー制御条件により STREAM 書き込みキューがフルになっている。
EAGAIN または ENOSR
作成するメッセージのためのバッファーを割り振ることができない。
EINVAL
以下のいずれかです。
  • strfdinsert 構造の fd メンバーが、正しいオープン STREAM ファイル記述子でない。
  • ポインターの大きさと offset を足したものが、ctlptr で指定されているバッファーの len メンバーのサイズより大きい。
  • offset メンバーが、データ・バッファー内の適切に配列される位置を指定していない。
  • flags に未定義の値が保管されている。
ENXIO
fd または fildes のハングアップを受信。
ERANGE
databuf で指定されているバッファーの len メンバーが、先頭の STREAM モジュールの最小および最大パケット・サイズで指定されている範囲にない、または、databuf で指定されているバッファーの len メンバーが、メッセージのデータ・パートの最大構成サイズを超えている。あるいは、ctlbuf で指定されているバッファーの len メンバーが、メッセージの制御パートの最大構成サイズを超えている。
I_STR
内部 STREAMS ioctl() メッセージを、arg が指すデータから作成し、そのメッセージを ダウンストリームへ送信します。

このメカニズムは、ioctl() 要求を、ダウンストリーム・モジュールおよびドライバーへ送信するために提供されています。これにより、ioctl() と共に情報を送ることができ、ダウンストリームの受信側からアップストリームに送られた情報すべてをプロセスに戻すことができます。 I_STR は、システムが肯定応答または否定応答のメッセージを返すまで、または、ある程度の時間が過ぎて要求が「タイムアウト」するまでブロックします。要求がタイムアウトになった場合、errno に ETIME を設定して失敗します。

STREAM 上で複数の I_STR をアクティブにすることはできません。他の I_STR 呼び出しは、アクティブな I_STR が STREAM ヘッドで完了するまでブロックします。これらの要求の タイムアウト時間は、デフォルトで 15 秒です。この呼び出しでは、O_NONBLOCK フラグは効果がありません。

要求をダウンストリームに送るには、argstrioctl 構造を指していなくてはいけません。

ic_cmd メンバーは、ダウンストリームのモジュールまたはドライバーを対象とした、内部 ioctl() コマンドです。ic_timeout は、I_STR 要求がタイムアウトになるまで応答を待機する秒数です (-1 は、無限を示し、0 は、設定に依存するタイムアウト時間の使用を示します。>0 は、指定どおりになります)。 ic_len メンバーは、入力時には渡すデータ引数の長さを含み、コマンドから戻る時はプロセス に戻されるバイト数 (ic_dp によって指定される buffer は、STREAM 内のモジュールまたはドライバーが戻す可能性のある最大のデータ量を含むことができる大きさ でなくてはいけません) を含む、2 つの使用法があります。

STREAM ヘッドは、strioctl 構造体が指す 情報を内部 ioctl() コマンド・メッセージに変換し、そのメッセージを ダウンストリームに送ります。

I_STR コマンドを指定している ioctl() は、次の場合に失敗します。
エラー・コード
説明
EAGAIN または ENOSR
ioctl() メッセージ用のバッファーを割り振ることができない。
EINVAL
この ic_len メンバーが 0 未満か、メッセージのデータ・パートの最大構成サイズより大きい。あるいは、ic_timeout が -1 未満。
ENXIO
fildes でハングアップを受信。
ETIME
肯定応答が受信される前にダウンストリームの ioctl() が タイムアウトになった。

I_STR は、応答を待っている間に STREAM ヘッドでエラーまたはハングアップを示す メッセージを受信した場合も失敗します。また、ダウンストリームに送られた ioctl() コマンドが失敗した場合は、肯定応答または否定応答メッセージ内にエラー・コードが戻されます。 このような場合、I_STR は、メッセージ内の値に errno を設定して失敗します。

I_SWROPT
引数 arg の値を使って、書き込みモードを設定します。arg のビット設定として適切なものは以下のとおりです。
SNDZERO
0 バイトの write() が発生した場合に、長さがゼロのメッセージをダウンストリームに送信する。0 バイトの write() が発生しても、長さがゼロのメッセージを送信しないようにするには、このビットを arg 内で設定してはいけない (例えば、arg を 0 に設定するなど)。
I_SWROPT コマンドを指定している ioctl() は、次の場合に失敗します。
エラー・コード
説明
EINVAL
arg が上記の値でない。
I_GWROPT
上記で説明されているように、現在の書き込みモード設定を 引数 arg が指す int に戻します。
I_SENDFD
I_SENDFD は ファイル記述子 arg に関連するオープン・ファイル記述子への新しい参照を作成し、参照と呼び出し側プロセスのユーザー ID およびグループ ID を含むメッセージを STREAMS ベース のパイプ fildes に書き込みます。
I_SENDFD コマンドを指定している ioctl() は、次の場合に失敗します。
エラー・コード
説明
EAGAIN
送信側の STREAM がファイル・ポインターを入れるメッセージ・ブロックを割り振ることができない。つまり、受信側の STREAM ヘッド読み取りキューがいっぱいで、I_SENDFD が送信したメッセージが受け入れられない。
EBADF
arg 引数が正しいオープン・ファイル記述子でない。
EINVAL
fildes 引数が STREAM パイプに接続されていない。
ENXIO
fildes でハングアップを受信。
I_RECVFD
I_SENDFD コマンドを使って、STREAMS ベースのパイプ内にあるメッセージから、オープン・ファイル記述子への参照を検索し、このオープン・ファイル記述子を参照する呼び出し側のプロセスで、新しいファイル記述子を割り振ります。arg 引数は、<stropts.h> で定義されている、strrecvfd データ構造へのポインターです。

fd メンバーはファイル記述子です。uid および gid メンバーは、それぞれ、送信側プロセスの有効なユーザー ID およびグループ ID です。

O_NONBLOCK が設定されていない場合、I_RECVFD は、メッセージが STREAM ヘッドに現れるまでブロックします。O_NONBLOCK が設定されている場合、STREAM ヘッドにメッセージが存在しないと、I_RECVFD は、errno を EAGAIN に設定して失敗します。

STREAM ヘッドにあるメッセージが I_SENDFD が送信したものである場合、メッセージ内で参照されているオープン・ファイル記述子 に対して新しいファイル記述子が割り振られます。新しいファイル記述子は、arg が指す strrecvfd 構造の fd メンバーに 置かれます。

I_RECVFD コマンドを指定している ioctl() は、次の場合に失敗します。
エラー・コード
説明
EAGAIN
STREAM ヘッド読み取りキューにメッセージが存在せず、O_NONBLOCK フラグが設定されている。
EBADMSG
STREAM ヘッド読み取りキューにあるメッセージが、渡されたファイル記述子を含むメッセージでない。
EMFILE
許可されているプロセスが、現在オープンしているファイル記述子の最大数を保有している。
ENXIO
fildes でハングアップを受信。
I_LIST
この要求は、プロセスが、STREAM 上にあるすべてのモジュール名を 一番先頭のドライバー名を含めてリストできるようにします。arg が NULL ポインターの場合、戻される値は fildes が指す STREAM 上にある、ドライバーを 含んだモジュール数になります。これにより、プロセスはモジュール名に十分なスペースを割り振ることができます。それ以外の場合、str_list 構造 へのポインターでなくてはいけません。

sl_nmods メンバーは、プロセスが配列中に割り振ったエントリーの 数を示します。戻るとき、str_list 構造の sl_modlist メンバーは、モジュール名のリストを 含んでいます。sl_modlist 配列に入れられたエントリーの数は、sl_nmode メンバー (この数にはドライバーを含むモジュールの数が 含まれます) にあります。ioctl() からの戻り値は 0 です。項目は、STREAM の一番上から始まって STREAM の終わりに達するまで、または 要求されたモジュール数 (sl_nmods) が満たされるまで、ダウンストリームに入ります。

I_LIST コマンドを指定している ioctl() は、次の場合に失敗します。
エラー・コード
説明
EAGAIN または ENOSR
バッファーを割り振ることができない。
EINVAL
sl_nmods メンバーが 1 未満。
I_ATMARK
この要求は、プロセスが、STREAM ヘッド読み取りキューの先頭にあるメッセージが ダウンストリームのモジュールによってマークされているかどうか判別できるようにします。arg 引数は、STREAM ヘッド読み取りキューにマークされたメッセージが複数ある可能性が ある場合に、どのようにチェックするかを決定します。以下の値が あります。

ANYMARK は、メッセージがマークされているかどうかをチェックします。

LASTMARK は、メッセージがキューでマークされている最後のものかどうかをチェックします。

フラグ ANYMARK および LASTMARK のビット単位包含 OR を指定することができます。

戻り値は、マーク条件が満たされる場合は 1 で、それ以外の場合は 0 になります。

I_ATMARK コマンドを指定している ioctl() は、次の場合に失敗します。

EINVAL arg 値が無効。

I_CKBAND
指定された優先順位バンドのメッセージが STREAM ヘッド読み取りキューに 存在するかどうかをチェックします。指定された優先順位のメッセージが存在する場合は 1、メッセージがまったく存在しない場合は 0、エラーの場合は -1 が戻されます。arg は int 型でなくてはいけません。

I_CKBAND コマンドを指定している ioctl() は、次の場合に失敗します。

EINVAL arg 値が無効。

I_GETBAND
STREAM ヘッド読み取りキューにある最初のメッセージの優先帯域を arg が参照する整数に戻します。

I_GETBAND コマンドを指定している ioctl() は、次の場合に失敗します。

ENODATA STREAM ヘッド読み取りキューにメッセージがない。

I_CANPUT
特定のバンドが書き込み可能かどうかを調べます。arg は、調べられる優先順位バンドに設定されます。バンドがフロー制御されている場合は 0、バンドが 書き込み可能な場合は 1、エラーの場合は -1 が戻されます。

I_CANPUT コマンドを指定している ioctl() は、次の場合に失敗します。

EINVAL arg 値が無効。

I_SETCLTIME
この要求は、STREAM がクローズ中で、書き込みキューにデータがある場合に、プロセスに STREAM ヘッドを遅らせる時間を設定できるようにします。各モジュールまたはドライバーをクローズする前に、書き込みキューにデータがある場合は、STREAM ヘッドは、データのドレーン処理をするために、指定された時間だけ遅れます。遅れた後にデータがまだ存在する場合、データはフラッシュされます。arg 引数は、遅れる時間をミリ秒で指定する整数を指し、その数は、最も近い適切な値に切り上げられます。I_SETCLTIME が STREAM 上で実行されない場合は、インプリメンテーションに依存するデフォルトのタイムアウト間隔が使用されます。

I_SETCLTIME コマンドを指定している ioctl() は、次の場合に失敗します。

EINVAL arg 値が無効。

I_GETCLTIME
この要求は、arg が指す整数内のクローズ遅延時間を戻します。
多重化 STREAMS 構成: 以下の 4 つのコマンドは、多重化 STREAMS 構成の接続および切断に 使用されます。これらのコマンドは、インプリメンテーションに依存する デフォルトのタイムアウト・インターバルを使用します。
I_LINK
2 つの STREAMS を接続し、fildes は多重化ドライバーに接続する STREAM のファイル記述子、arg は別のドライバーに接続する STREAM のファイル記述子です。arg が 指定する STREAM が、多重化ドライバーの下に接続されます。I_LINK は、接続に関して多重化ドライバーが 肯定応答メッセージを STREAM ヘッドに送信することを要求します。この呼び出しは、正常に実行された場合はマルチプレクサー ID 番号 (マルチプレクサーの切断に使用する ID、I_UNLINK を参照) が戻されます。正常に実行されなかった場合は、-1 が戻されます。
I_LINK コマンドを指定している ioctl() は、次の場合に失敗します。
エラー・コード
説明
EAGAIN または ENOSR
I_LINK を実行するための STREAMS ストレージを割り振ることができない。
EBADF
arg 引数が正しいオープン・ファイル記述子でない。
EINVAL
fildes が多重化をサポートしていない、または arg が STREAM でないか、既にマルチプレクサーからダウンストリームに接続している。または指定された I_LINK 操作が STREAM ヘッドを多重化 STREAM の複数の場所に接続しようと している。
ENXIO
fildes でハングアップを受信。
ETIME
STREAM ヘッドで肯定応答メッセージを受信する前にタイムアウト。

多重化ドライバーが、要求に応答するのを待っている間に、エラーまたはハングアップを示すメッセージが、fildes の STREAM ヘッドで受信された場合も、I_LINK は失敗します。また、エラー・コードが、肯定または否定応答メッセージに戻されます。このような場合、I_LINK は、メッセージ内の値に errno を設定して失敗します。

I_UNLINK
fildes および arg によって指定される 2 つの STREAM を切断します。fildes は、多重化ドライバーに接続している STREAM のファイル記述子です。arg 引数は、STREAM が多重化ドライバーから ダウンストリームに接続されたときに、I_LINK ioctl() コマンド から戻されたマルチプレクサー ID 番号です。arg が MUXID_ALL の場合、fildes に接続されていた STREAM はすべて切断されます。 I_LINK と同様に、このコマンドは 肯定応答を必要とします。
I_UNLINK コマンドを指定している ioctl() は、次の場合に失敗します。
エラー・コード
説明
EAGAIN または ENOSR
肯定応答メッセージ用のバッファーを割り振ることができない。
EINVAL
マルチプレクサー ID 番号が無効。
ENXIO
fildes でハングアップを受信。
ETIME
STREAM ヘッドで肯定応答メッセージを受信する前にタイムアウト。

I_UNLINK は、多重化ドライバーが要求に応答するのを待っている間に、fildes の STREAM ヘッドで エラーまたはハングアップを示すメッセージを受信した場合も失敗します。また、エラー・コードが 肯定または否定応答メッセージ内に戻されます。 このような場合、I_UNLINK は、メッセージ内の値に errno を設定して失敗します。

I_PLINK
2 つの STREAM 間に永続的な接続 を作成します。fildes は、別のドライバーに接続している STREAM のファイル記述子です。この呼び出しは、多重化ドライバーに対して上位にある、STREAM に関連するファイル記述子 fildes がクローズされても存在できる、永続的な接続を作成します。arg が指定する STREAM が、永続的な接続を使用して多重化ドライバーの下に接続されます。I_PLINK は、多重化ドライバーが 肯定応答メッセージを STREAM ヘッドに送信することを要求します。この呼び出しは、成功した場合はマルチプレクサー ID 番号 (マルチプレクサーの切断に使用する ID、I_PUNLINK を参照してください) を、失敗した場合は -1 を戻します。
I_PLINK コマンドを指定している ioctl() は、次の場合に失敗します。
エラー・コード
説明
EAGAIN または ENOSR
I_PLINK を実行するための STREAMS ストレージを割り振ることができない。
EBADF
arg 引数が正しいオープン・ファイル記述子でない。
EINVAL
fildes 引数が多重化をサポートしていない。つまり、arg が STREAM でない、または 既にマルチプレクサーからダウンストリームに接続されている。あるいは、指定した I_PLINK 操作が STREAM ヘッドを多重化 STREAM の複数の場所に接続しようとしている。
ENXIO
fildes でハングアップを受信。
ETIME
STREAM ヘッドで肯定応答メッセージを受信する前にタイムアウト。

I_PLINK は、多重化ドライバーが要求に応答するのを待っている間に、fildes の STREAM ヘッドで エラーまたはハングアップを示すメッセージを受信した場合も失敗します。また、エラー・コードが 肯定または否定応答メッセージ内に戻されます。 このような場合、I_PLINK は、メッセージ内の値に errno を設定して失敗します。

I_PUNLINK
fildes および arg によって指定される 2 つの STREAM を 永続的な接続から切断します。fildes 引数は、多重化ドライバーに接続 している STREAM のファイル記述子です。arg 引数は、STREAM が多重化ドライバーから ダウンストリームに接続されたときに、I_PLINK ioctl() コマンド から戻されたマルチプレクサー ID 番号です。arg が MUXID_ALL の場合、fildes に永続的に接続されていた STREAM はすべて切断されます。 I_PLINK と同様に、このコマンドは多重化ドライバーが要求に肯定応答することを必要とします。
I_PUNLINK コマンドを指定している ioctl() は、次の場合に失敗します。
エラー・コード
説明
EAGAIN または ENOSR
肯定応答メッセージ用のバッファーを割り振ることができない。
EINVAL
マルチプレクサー ID 番号が無効。
ENXIO
fildes でハングアップを受信。
ETIME
STREAM ヘッドで肯定応答メッセージを受信する前にタイムアウト。

I_PUNLINK は、多重化ドライバーが要求に応答するのを待っている間に、fildes の STREAM ヘッドで エラーまたはハングアップを示すメッセージを受信した場合も失敗します。また、エラー・コードが、肯定または否定応答メッセージに戻されます。このような場合、I_PUNLINK は、メッセージ内の値に errno を設定して失敗します。

STREAMS 戻り値

正常に終了した場合、ioctl() は -1 以外の値を戻します。この値は、STREAMS 装置制御関数により異なります。

正常に実行されなかった場合、ioctl() は -1 を戻して、errno を次のいずれかの値に設定します。

注: z/OS®UNIX サービスが STREAMS 方式のファイルを提供しないため、ioctl() が STREAMS タイプのコマンドを実行できません。関数は必ず失敗し、-1 を戻して失敗を示す errno を 設定します。詳細は、open() — ファイルのオープンを参照してください。

以下の一般条件の下では、ioctl() は次のような場合に失敗します。

エラー・コード
説明
EBADF
fildes 引数は、有効なオープン・ファイル記述子では ありません。
EINTR
ioctl() 操作時中にシグナルがキャッチされました。
EINVAL
fildes が 参照する STREAM またはマルチプレクサーは、マルチプレクサーから ダウンストリームへ (直接または間接に) リンクされます。
以下の装置ドライバーがエラーを検出したとき、ioctl() は次の場合に失敗します。
エラー・コード
説明
EINVAL
cmd または arg 引数が、この装置に対して 無効です。
EIO
何らかの物理 I/O エラーが発生しました。
ENODEV
fildes 引数は、有効な STREAMS 装置を参照していますが、対応する装置ドライバーが ioctl() をサポートしていません。
ENOTTY
fildes 引数が、制御関数を受け付ける STREAMS 装置と 関連付けられていません。
ENXIO
引数 cmd または arg がこの装置ドライバーに対して無効であり、要求されたサービスがこの特定の従属装置上で実行できません。

STREAM が、マルチプレクサーからダウンストリームに接続されている場合、ioctl() コマンドは、I_UNLINK および I_PUNLINK を除き、すべてが errno を EINVAL に設定します。

ACL

ACL では次の ioctl() コマンドが使用されます。
コマンド
説明
SETFACL
ACL を設定します。アクセス制御リストに情報を設定するために使用します。arg は、すぐあとに struct ACL_entrys の配列が続く struct ACL_buf によってマップ される入力 ACL を含むユーザー・バッファーを指定 します。arglen は、struct ACL_buf と struct ACL_entrys の配列を結合した長さを指定 します。ACL_buf および ACL_entrys についての詳細は、「z/OS UNIX System Services プログラミング: アセンブラー呼び出し可能サービス 解説書」を参照してください。
GETFACL
ACL を取得します。アクセス制御リストから情報を検索するために使用します。arg は、要求した ACL が戻されるユーザー・バッファーを指定します。データは、すぐあとに struct ACL_entrys の配列が続く struct ACL_BUF によってマップ されます。ACL_buf および ACL_entrys についての詳細は、「z/OS UNIX System Services プログラミング: アセンブラー呼び出し可能サービス 解説書」を参照してください。Arglen は、struct ACL とユーザー・バッファー内の struct ACL_entrys の配列を 結合した長さを指定します。

ACL 戻り値

正常に実行された場合、ioctl() は 0 を戻します。

正常に実行されなかった場合、ioctl() は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
EBADF
fildes パラメーターが、正しいファイル記述子ではありません。
EINVAL
要求が無効か、またはサポートされていません。
EMVSPARM
無効なパラメーターがサービスに渡されました。
ENODEV
装置が正しくありません。この関数は装置ドライバーによってサポートされません。

ioctl() 呼び出しの例を次に示します。
int s;
int rc;
int acllen;
ext_acl_t aclbufp;
s = open("datafile", O_RDWR);
acllen = sizeof struct ACL_buf + (1024 * sizeof ACL_entry);
aclbufp = (ext_acl_t) malloc(acllen);
rc  =  ioctl(s, GETFACL, acllen, aclbufp)

関連情報