putmsg()、putpmsg() - STREAM に関するメッセージの送信

標準

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

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

両方  

形式

#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 ポインターであってはならず、dataptrlen メンバーは 0 またはそれより大きく なければなりません。メッセージの制御パートを送信するために、対応する値は ctlptr に 設定する必要があります。dataptr (ctlptr) が NULL ポインターであるか、dataptr (ctlptr) の len メンバー が -1 に設定されている場合には、データ (制御) パートは送信されません。

putmsg() では、制御パートが指定され、flagsRS_HIPRI に設定されていると、高優先順位メッセージが送信されます。制御パートが指定されず、flagsRS_HIPRI に設定されていると、putmsg() は失敗し、errno を EINVAL に設定します。flags が 0 に設定された場合には、標準メッセージ (0 に等しい 優先順位バンド) が送信されます。制御パートとデータ・パートが指定されず、flags が 0 に設定された 場合には、メッセージは送信されず、0 が戻されます。

STREAM ヘッドは、putmsg() によって生成されたメッセージの 制御パートの長さが 64 バイト以上になるように保証します。

putpmsg() の場合には、フラグは異なっています。flags 引数は、次の相互に排他的なフラグ MSG_HIPRIMSG_BAND が 定義されたビット・マスクです。 flags が 0 に設定された場合には、putpmsg() は失敗し、errno を EINVAL に設定します。制御パートが指定され、flagsMSG_HIPRI に設定され、band が 0 に設定された場合には、高優先順位メッセージが送信されます。flagsMSG_HIPRI に設定され、制御パートが指定されない か、あるいは band がゼロ以外の値に設定された場合には、putpmsg() は失敗し、errno を EINVAL に設定します。flagsMSG_BAND に設定された場合には、メッセージは、band によって指定された優先順位バンドで送信されます。制御パートとデータ・パートが指定されず、flagsMSG_BAND に設定された場合には、メッセージは 送信されず、0 が戻されます。

STREAM 書き込みキューが内部フロー制御条件のためにいっぱいになっている 場合には、putmsg() 関数がブロックします。ただし、以下は例外です。
  • 高優先順位メッセージの場合には、putmsg() はこの条件では ブロックせず、メッセージの処理を続行します。
  • 他のメッセージの場合には、putmsg() はブロックしませんが、書き込みキューがいっぱいで、O_NONBLOCK が設定されたときに 失敗します。

内部リソースの不足で妨害されない限り、優先順位や O_NONBLOCK が 指定されているかどうかに関係なく、STREAM でメッセージ・ブロックの可用性を 待機しているときも、putmsg() 関数はブロックします。部分メッセージは送信されません。

次のシンボリック定数は <stropts.h> の _XOPEN_SOURCE_EXTENDED 1 で 定義されています。
MSG_ANY
任意のメッセージの受信。
MSG_BAND
指定のバンドからのメッセージの受信。
MSG_HIPRI
高優先順位メッセージの送受信。
MORECTL
メッセージにまだ制御情報が残っている。
MOREDATA
メッセージにまだデータが残っている。

戻り値

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

正常に実行されなかった場合、putmsg() および putpmsg() は -1 を戻し、errno を次のいずれかの値に設定します。
注: z/OS®UNIX サービスは、どのような STREAMS 装置または疑似装置も提 供しません。putmsg() と putpmsg() が STREAM 上のメッセージを 送信することはできません。常に -1 が戻され、失敗を示す errno が設定されます。open() — ファイルのオープンを参照してください。
エラー・コード
説明
EAGAIN
非優先順位メッセージが指定され、O_NONBLOCK フラグが設定され、STREAM 書き込みキューが内部フロー制御条件のためにいっぱいになっています。あるいは、作成されることになっていたメッセージに対してバッファーを 割り振ることができませんでした。
EBADF
fildes は、書き込みのためにオープンしている有効なファイル記述子 ではありません。
EINTR
putmsg() 時にシグナルがキャッチされました。
EINVAL
未定義の値が flags に指定されたか、flagsRS_HIPRI または MSG_HIPRI に設定されて制御パートが提供されていないか、 fildes によって参照された STREAM またはマルチプレクサーがマルチプレクサーからダウンストリームに (直接または間接的に) リンクされたか、あるいは flagsMSG_HIPRI に設定され、band がゼロ以外 (putpmsg() に対してのみ) になっています。
ENOSR
STREAMS メモリー・リソースが不足しているため、作成する予定のメッセージに 対してバッファーを割り振ることができませんでした。
ENOSTR
STREAM が fildes に関連していません。
ENXIO
ハングアップ条件が、指定された STREAM のダウンストリームで生成され ました。
EPIPE または EIO
fildes 引数は STREAMS ベースのパイプを指し、パイプの 他の端がクローズしています。呼び出しプロセスに対して SIGPIPE シグナルが生成されます。
ERANGE
メッセージのデータ・パートのサイズは、最高の STREAM モジュールの 最大および最小パケット・サイズによって指定された範囲内に入っていません。また、メッセージの制御パートがメッセージの制御パートの最大構成サイズより 大きい場合、あるいはメッセージのデータ・パートがメッセージのデータ・パートの最大構成サイズより大きい場合にも、この値は戻されます。

さらに、呼び出し前に STREAM ヘッドが非同期のエラーを処理すると、putmsg() と putpmsg() は失敗します。この場合には、errno の値は putmsg() または putpmsg() の 結果を反映しませんが、前のエラーを反映します。

関連情報