標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
XPG4.2 |
両方 |
#define _XOPEN_SOURCE_EXTENDED 1
#include <stropts.h>
int putmsg(int fildes, const struct strbuf *ctlptr,
const struct strbuf *dataptr, int flags);
int putpmsg(int fildes, const struct strbuf *ctlptr,
const struct strbuf *dataptr, int band, int flags);
putmsg() 関数は、プロセス・バッファー (1 つ以上) から メッセージを作成し、STREAMS ファイルへメッセージを送信します。 メッセージには、データ・パート、制御パート、またはその両方のいずれかを 含めます。データ・パートと制御パートは、下に記述したとおり、別々のバッファーに 配置すると区別されます。各パートのセマンティクスは、メッセージを受け取る STREAMS モジュールで 定義されます。
putpmsg() 関数は putmsg() と同じことを実行します が、プロセスは異なる優先順位バンドでメッセージを送信できます。注記されていることを除いて、putmsg() に関するすべての要件 も putpmsg() に関連しています。
fildes 引数は、オープン STREAM を参照するファイル記述子を 指定します。ctlptr 引数と dataptr 引数はそれぞれ、strbuf 構造体を指しています。
ctlptr 引数は、メッセージにインクルードされる、制御パートについて 記述する構造体 (ある場合) を指します。strbuf 構造体の buf メンバーは、制御情報が存在して いるバッファーを指し、len メンバーは送信されるバイト数を示します。 maxlen メンバーは、putmsg() によって使用されません。同様に、引数 dataptr は、メッセージにインクルードされるデータ (ある場合) を指定します。flags 引数は送信する必要があるメッセージのタイプを示し、その詳細は 下に記述されています。
メッセージのデータ・パートを送信するために、dataptr は NULL ポインターであってはならず、dataptr の len メンバーは 0 またはそれより大きく なければなりません。メッセージの制御パートを送信するために、対応する値は ctlptr に 設定する必要があります。dataptr (ctlptr) が NULL ポインターであるか、dataptr (ctlptr) の len メンバー が -1 に設定されている場合には、データ (制御) パートは送信されません。
putmsg() では、制御パートが指定され、flags が RS_HIPRI に設定されていると、高優先順位メッセージが送信されます。制御パートが指定されず、flags が RS_HIPRI に設定されていると、putmsg() は失敗し、errno を EINVAL に設定します。flags が 0 に設定された場合には、標準メッセージ (0 に等しい 優先順位バンド) が送信されます。制御パートとデータ・パートが指定されず、flags が 0 に設定された 場合には、メッセージは送信されず、0 が戻されます。
STREAM ヘッドは、putmsg() によって生成されたメッセージの 制御パートの長さが 64 バイト以上になるように保証します。
putpmsg() の場合には、フラグは異なっています。flags 引数は、次の相互に排他的なフラグ MSG_HIPRI と MSG_BAND が 定義されたビット・マスクです。 flags が 0 に設定された場合には、putpmsg() は失敗し、errno を EINVAL に設定します。制御パートが指定され、flags が MSG_HIPRI に設定され、band が 0 に設定された場合には、高優先順位メッセージが送信されます。flags が MSG_HIPRI に設定され、制御パートが指定されない か、あるいは band がゼロ以外の値に設定された場合には、putpmsg() は失敗し、errno を EINVAL に設定します。flags が MSG_BAND に設定された場合には、メッセージは、band によって指定された優先順位バンドで送信されます。制御パートとデータ・パートが指定されず、flags が MSG_BAND に設定された場合には、メッセージは 送信されず、0 が戻されます。
内部リソースの不足で妨害されない限り、優先順位や O_NONBLOCK が 指定されているかどうかに関係なく、STREAM でメッセージ・ブロックの可用性を 待機しているときも、putmsg() 関数はブロックします。部分メッセージは送信されません。
正常に実行された場合、putmsg() と putpmsg() は 0 を戻します。
さらに、呼び出し前に STREAM ヘッドが非同期のエラーを処理すると、putmsg() と putpmsg() は失敗します。この場合には、errno の値は putmsg() または putpmsg() の 結果を反映しませんが、前のエラーを反映します。