標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
XPG4.2 |
両方 |
#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 */);
#define _XOPEN_SOURCE_EXTENDED 1
#include <stropts.h>
int ioctl(int fildes int cmd, ... /* arg */);
ioctl() は、装置上でさまざまな制御関数を実行します。cmd 引数と任意指定の 3 番目の引数 (さまざまなタイプ) が、fildes に対応する装置に渡されて、変換されます。
cmd 引数は、実行される制御関数を選択し、アドレスされる装置に依存します。
arg 引数は、この特定の装置が要求された関数を実行するために必要とする追加の情報を表します。arg のタイプは、特定の制御要求に依存しますが、整数または装置特定のデータ構造へのポインターです。
FIOGETOWN および FIOSETOWN は、fctl() の F_GETOWN および F_SETOWN コマンドと同等です。pid の値についての詳細は、この関数を参照してください。この関数は、AF_INET ストリーム・ソケットに対してのみ有効です。
ネットワーク・インターフェース・アドレスを取得します。arg は、<net/if.h> で定義される、ifreq 構造へのポインターです。 インターフェース・アドレスが、引数に戻されます。このオプションは、AF_INET ドメインの場合にのみ有効です。
このマクロは、_OPEN_SYS_IF_EXT フィーチャーによって保護されます。
ネットワーク・インターフェース・ブロードキャスト・アドレス を取得します。arg は、<net/if.h> で定義される、ifreq 構造へのポインターです。 インターフェース・ブロードキャスト・アドレスが、引数に戻されます。このオプションは、AF_INET ドメインの場合にのみ有効です。
このマクロは、_OPEN_SYS_IF_EXT フィーチャーによって保護されます。
ネットワーク・インターフェース構成を取得します。arg は、<net/if.h> 内で定義されている ifconf 構造へのポインターです。インターフェース構成は、ifconf 構造によって指定されるバッファーに戻されます。戻されたデータの長さが、前にバッファーの長さが含まれていたフィールドに戻されます。このオプションは、AF_INET ドメインの場合にのみ有効です。
このマクロは、_OPEN_SYS_IF_EXT フィーチャーによって保護されます。
OSM インターフェースを要求するには、アプリケーションが EZB.OSM.sysname.tcpname リソースに対する読み取り権限を持っている必要があります。
struct __net_ifconf6header_s は、ioctl の引数として受け渡されます。この構造体は、構成情報が書き込まれるべき場所、および各 struct と出力バッファーに書き込まれた __net_ifconf6entry_s のエントリー数およびエントリー長を使用して構成情報が戻される場所を指定します。 これらの構造体は、<sys/ioctl.h> で定義されます。
__nif6h_buflen および __nif6h_buffer が共にゼロの場合、照会関数が実行され、次のようにヘッダーが戻されます。
errno = ERANGE, or
errno = EINVAL and __nif6h_version has changed
この呼び出しは照会関数に変換され、ヘッダーは上記のように書き込まれています。
これらの場合、出力バッファーの内容は不確定です。共通の INET が構成され、複数の TCP/IP スタックがソケットに接続される場合、IPv6 に対して使用可能状態の各スタックからの出力は出力バッファーで連結され、ヘッダーには全スタックから戻されるエントリー総数が入ります。 照会関数を使用して戻されるバージョンは、すべてのスタックがサポートする最新バージョンです。
この ioctl は、AF_INET または AF_INET6 ソケットで実行可能です。
ネットワーク・インターフェース宛先アドレスを取得します。arg は、<net/if.h> で定義される、ifreq 構造へのポインターです。 インターフェース宛先 (Point-to-Point) アドレスが、引数に戻されます。このオプションは、AF_INET ドメインの場合にのみ有効です。
このマクロは、_OPEN_SYS_IF_EXT フィーチャーによって保護されます。
ネットワーク・インターフェース・フラグを取得します。arg は、<net/if.h> で定義される、ifreq 構造へのポインターです。 インターフェース・フラグが引数に戻されます。このオプションは、AF_INET ドメインの場合にのみ有効です。
このマクロは、_OPEN_SYS_IF_EXT フィーチャーによって保護されます。
ネットワーク・インターフェース・ルーティング・メトリックを取得します。arg は、<net/if.h> で定義される、ifreq 構造へのポインターです。 インターフェース・ルーティング・メトリックが、引数に戻されます。このオプションは、AF_INET ドメインの場合にのみ有効です。
このマクロは、_OPEN_SYS_IF_EXT フィーチャーによって保護されます。
ネットワーク・インターフェース MTU (最大伝送単位) を取得します。 arg は、<net/if.h> 内で定義されている ifreq 構造へのポインターです。インターフェース MTU が引数 arg->ifr_mtu に戻されます。このオプションは、AF_INET ドメインの場合にのみ有効です。
このマクロは、_OPEN_SYS_IF_EXT フィーチャーによって保護されます。
ネットワーク・インターフェース・ネットワーク・マスクを取得します。arg は、<net/if.h> で定義される、ifreq 構造へのポインターです。 インターフェース・ネットワーク・マスクが、引数に戻されます。このオプションは、AF_INET ドメインの場合にのみ有効です。
このマクロは、_OPEN_SYS_IF_EXT フィーチャーによって保護されます。
sysplexFqDnData 構造体には、サーバー名 (入力)、グループ名 (入力)、および完全修飾ドメイン名 (出力) が入っています。
#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. */
サーバー・ソケットに対して、セキュリティー環境を SET または GET するのに使用されます。 arg は struct __seco_s を示します。ここで、エレメント __seco_argument は、SET 要求に対しては 1 に、GET 要求に対しては 2 に設定されます。
SET 引数を指定時は、AF_UNIX ストリーム・ソケット・サーバーは、接続するクライアントの完全なセキュリティー環境を必要とするものとしてこのサーバー・ソケットを指定して、この接続の正常完了前に使用可能になるようにします。 接続処理時に、接続はコネクターのセキュリティー環境を入手し、このコネクターのソケットから、そのコネクターがアンカーされた状態を解除して、サーバーが使用できるようにします。 接続処理の間にセキュリティー環境を入手できない場合、その接続は失敗します。このコマンドは、サーバー・ソケットにならないソケットに影響しません。
GET 引数を指定時は、AF_UNIX ストリーム・ソケット・サーバーは、コネクターのアドレス・スペースからサーバーのアドレス・スペースへ、事前に SET されたセキュリティー環境をコピーします。これにより、セキュリティー製品への呼び出しの際に入力として使用できるようになります。 このコマンドが意味を持つのは、以前に SET 引数指定で SIOCSECENVR を実行したサーバー・ソケットに対してのみです。
ネットワーク・インターフェース・ルーティング・メトリックを設定します。arg は、<net/if.h> で定義される、ifreq 構造へのポインターです。 SIOCSIFMETRIC は、インターフェース・ルーティング・メトリックを引数として渡された値に設定します。このオプションは、AF_INET ドメインの場合にのみ有効です。
このマクロは、_OPEN_SYS_IF_EXT フィーチャーによって保護されます。
C++ の特殊な動作: C++ でこの関数を使用するには、_XOPEN_SOURCE_EXTENDED 1 フィーチャー・テスト・マクロを 使用する必要があります。
正常に実行された場合、ioctl() は 0 を戻します。
int s;
int dontblock;
int rc;
⋮
/* Place the socket into nonblocking mode */
dontblock = 1;
rc = ioctl(s, FIONBIO, (
char *) &dontblock);
⋮
arg が 0 の場合、呼び出し側のプロセスが登録解除され、fildes に関連付けられた STREAM に対する SIGPOLL シグナルを受信できなくなります。
SIGPOLL シグナルの受信が必要なプロセスは、I_SETSIG を使って、シグナルの受信を明示的に登録しなければいけません。複数のプロセスが、同じ STREAM 上の 同じイベントについてシグナルを受信するよう登録した場合、イベントが発生したときにすべての プロセスにシグナルが送信されます。
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 の値が含まれます。
RMSGD と RMSGN のビット単位包含 OR は、EINVAL を戻します。RNORM と、RMSGD または RMSGN のビット単位包含 OR により、デフォルトである RNORM が他のフラグで上書きされます。
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 内のメッセージ・ ブロックが使用可能になるのを待つためにブロックします。部分メッセージは送信されません。
このメカニズムは、ioctl() 要求を、ダウンストリーム・モジュールおよびドライバーへ送信するために提供されています。これにより、ioctl() と共に情報を送ることができ、ダウンストリームの受信側からアップストリームに送られた情報すべてをプロセスに戻すことができます。 I_STR は、システムが肯定応答または否定応答のメッセージを返すまで、または、ある程度の時間が過ぎて要求が「タイムアウト」するまでブロックします。要求がタイムアウトになった場合、errno に ETIME を設定して失敗します。
STREAM 上で複数の I_STR をアクティブにすることはできません。他の I_STR 呼び出しは、アクティブな I_STR が STREAM ヘッドで完了するまでブロックします。これらの要求の タイムアウト時間は、デフォルトで 15 秒です。この呼び出しでは、O_NONBLOCK フラグは効果がありません。
要求をダウンストリームに送るには、arg が strioctl 構造を指していなくてはいけません。
ic_cmd メンバーは、ダウンストリームのモジュールまたはドライバーを対象とした、内部 ioctl() コマンドです。ic_timeout は、I_STR 要求がタイムアウトになるまで応答を待機する秒数です (-1 は、無限を示し、0 は、設定に依存するタイムアウト時間の使用を示します。>0 は、指定どおりになります)。 ic_len メンバーは、入力時には渡すデータ引数の長さを含み、コマンドから戻る時はプロセス に戻されるバイト数 (ic_dp によって指定される buffer は、STREAM 内のモジュールまたはドライバーが戻す可能性のある最大のデータ量を含むことができる大きさ でなくてはいけません) を含む、2 つの使用法があります。
STREAM ヘッドは、strioctl 構造体が指す 情報を内部 ioctl() コマンド・メッセージに変換し、そのメッセージを ダウンストリームに送ります。
I_STR は、応答を待っている間に STREAM ヘッドでエラーまたはハングアップを示す メッセージを受信した場合も失敗します。また、ダウンストリームに送られた ioctl() コマンドが失敗した場合は、肯定応答または否定応答メッセージ内にエラー・コードが戻されます。 このような場合、I_STR は、メッセージ内の値に errno を設定して失敗します。
fd メンバーはファイル記述子です。uid および gid メンバーは、それぞれ、送信側プロセスの有効なユーザー ID およびグループ ID です。
O_NONBLOCK が設定されていない場合、I_RECVFD は、メッセージが STREAM ヘッドに現れるまでブロックします。O_NONBLOCK が設定されている場合、STREAM ヘッドにメッセージが存在しないと、I_RECVFD は、errno を EAGAIN に設定して失敗します。
STREAM ヘッドにあるメッセージが I_SENDFD が送信したものである場合、メッセージ内で参照されているオープン・ファイル記述子 に対して新しいファイル記述子が割り振られます。新しいファイル記述子は、arg が指す strrecvfd 構造の fd メンバーに 置かれます。
sl_nmods メンバーは、プロセスが配列中に割り振ったエントリーの 数を示します。戻るとき、str_list 構造の sl_modlist メンバーは、モジュール名のリストを 含んでいます。sl_modlist 配列に入れられたエントリーの数は、sl_nmode メンバー (この数にはドライバーを含むモジュールの数が 含まれます) にあります。ioctl() からの戻り値は 0 です。項目は、STREAM の一番上から始まって STREAM の終わりに達するまで、または 要求されたモジュール数 (sl_nmods) が満たされるまで、ダウンストリームに入ります。
ANYMARK は、メッセージがマークされているかどうかをチェックします。
LASTMARK は、メッセージがキューでマークされている最後のものかどうかをチェックします。
フラグ ANYMARK および LASTMARK のビット単位包含 OR を指定することができます。
戻り値は、マーク条件が満たされる場合は 1 で、それ以外の場合は 0 になります。
I_ATMARK コマンドを指定している ioctl() は、次の場合に失敗します。
EINVAL arg 値が無効。
I_CKBAND コマンドを指定している ioctl() は、次の場合に失敗します。
EINVAL arg 値が無効。
I_GETBAND コマンドを指定している ioctl() は、次の場合に失敗します。
ENODATA STREAM ヘッド読み取りキューにメッセージがない。
I_CANPUT コマンドを指定している ioctl() は、次の場合に失敗します。
EINVAL arg 値が無効。
I_SETCLTIME コマンドを指定している ioctl() は、次の場合に失敗します。
EINVAL arg 値が無効。
多重化ドライバーが、要求に応答するのを待っている間に、エラーまたはハングアップを示すメッセージが、fildes の STREAM ヘッドで受信された場合も、I_LINK は失敗します。また、エラー・コードが、肯定または否定応答メッセージに戻されます。このような場合、I_LINK は、メッセージ内の値に errno を設定して失敗します。
I_UNLINK は、多重化ドライバーが要求に応答するのを待っている間に、fildes の STREAM ヘッドで エラーまたはハングアップを示すメッセージを受信した場合も失敗します。また、エラー・コードが 肯定または否定応答メッセージ内に戻されます。 このような場合、I_UNLINK は、メッセージ内の値に errno を設定して失敗します。
I_PLINK は、多重化ドライバーが要求に応答するのを待っている間に、fildes の STREAM ヘッドで エラーまたはハングアップを示すメッセージを受信した場合も失敗します。また、エラー・コードが 肯定または否定応答メッセージ内に戻されます。 このような場合、I_PLINK は、メッセージ内の値に errno を設定して失敗します。
I_PUNLINK は、多重化ドライバーが要求に応答するのを待っている間に、fildes の STREAM ヘッドで エラーまたはハングアップを示すメッセージを受信した場合も失敗します。また、エラー・コードが、肯定または否定応答メッセージに戻されます。このような場合、I_PUNLINK は、メッセージ内の値に errno を設定して失敗します。
正常に終了した場合、ioctl() は -1 以外の値を戻します。この値は、STREAMS 装置制御関数により異なります。
正常に実行されなかった場合、ioctl() は -1 を戻して、errno を次のいずれかの値に設定します。
以下の一般条件の下では、ioctl() は次のような場合に失敗します。
STREAM が、マルチプレクサーからダウンストリームに接続されている場合、ioctl() コマンドは、I_UNLINK および I_PUNLINK を除き、すべてが errno を EINVAL に設定します。
正常に実行された場合、ioctl() は 0 を戻します。
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)