Unix-system-calls-msgop

提供:Dev Guides
移動先:案内検索

[top]#

[[File:]]

[[File:]]

|Web |This Site

  • 初心者向けのUnix *
  • 高度なUnix *

選択した読書

Copyright©2014 by finddevguides

  Home     References     Discussion Forums     About TP  

msgop()-Unix、Linuxシステムコール

[[File:]] image :http://www.finddevguides.com/images/next.gif [next] image:http://www.finddevguides.com/add- this.gif [AddThisソーシャルブックマークボタン]

広告

NAME

msgop-メッセージ操作

概要

#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h>
*int msgsnd(int* __msqid __ **、** * *const void* * *__ msgp __* 、* *size_t* __msgsz __ **、** *int* __msgflg __ **); **
*ssize_t msgrcv(int* __msqid __ **、** * *void* * *__ msgp __* 、* *size_t* __msgsz __ **、** *long* __msgtyp __ **、** *int* __msgflg __ **); **

説明

*msgsnd* ()および *msgrcv* ()システムコールは、それぞれメッセージキューとの間でメッセージを送受信するために使用されます。 呼び出し元プロセスは、メッセージを送信するためにメッセージキューに対する書き込み許可を持ち、メッセージを受信するための読み取り許可を持っている必要があります。

_msgp_引数は、次の一般的な形式の呼び出し元定義の構造体へのポインタです。

  • struct msgbuf \ {* long mtype;/ メッセージタイプ、0より大きい必要があります / char mtext [1];/ メッセージデータ / *};

_mtext_フィールドは、サイズが負でない整数値である_msgsz_で指定される配列(または他の構造体)です。 長さがゼロのメッセージ(つまり、_mtext_フィールドがない)は許可されます。 _mtype_フィールドには、厳密に正の整数値が必要です。 この値は、メッセージ選択のために受信プロセスで使用できます(以下の msgrcv ()の説明を参照)。

*msgsnd* ()システムコールは、_msgp_が指すメッセージのコピーを、_msqid_で指定された識別子を持つメッセージキューに追加します。

キューに十分なスペースがある場合、 msgsnd ()はすぐに成功します。 (キューの容量は、メッセージキューの関連データ構造の_msg_bytes_フィールドで定義されます。 キューの作成中、このフィールドは MSGMNB バイトに初期化されますが、この制限は msgctl ()を使用して変更できます。)キューに十分なスペースがない場合、 msgsnd ()のデフォルトの動作はスペースが使用可能になります。 _msgflg_で IPC_NOWAIT が指定されている場合、呼び出しは代わりにエラー EAGAIN で失敗します。

ブロックされた msgsnd ()呼び出しは、キューが削除された場合(_errno_が EIDRM に設定されて失敗する場合)、またはシグナルがキャッチされた場合(その場合、_errno_が設定されてシステム呼び出しが失敗する場合) EINTR )。 ( msgsndmsgrcv は、シグナルハンドラーを確立する際の SA_RESTART フラグの設定に関係なく、シグナルハンドラーによって中断された後、自動的に再起動されることはありません。

正常に完了すると、メッセージキューのデータ構造が次のように更新されます。

Tag

説明

_msg_lspid_は、呼び出しプロセスのプロセスIDに設定されます。

_msg_qnum_は1ずつ増加します。

_msg_stime_は現在の時刻に設定されます。

システムコール msgrcv ()は、_msqid_で指定されたキューからメッセージを削除し、_msgp_を指すバッファーに入れます。

引数_msgsz_は、_msgp_引数が指す構造体のメンバー_mtext_の最大サイズをバイト単位で指定します。 メッセージテキストの長さが_msgsz_より大きい場合、動作は_msgflg_で MSG_NOERROR が指定されているかどうかによって異なります。 MSG_NOERROR が指定されている場合、メッセージテキストは切り捨てられます(切り捨てられた部分は失われます)。 MSG_NOERROR が指定されていない場合、メッセージはキューから削除されず、システムコールは_errno_を E2BIG に設定して-1を返すことに失敗します。

引数_msgtyp_は、要求されたメッセージのタイプを次のように指定します。

_msgtyp_が0の場合、キュー内の最初のメッセージが読み取られます。

_msgtyp_が0より大きい場合、 MSG_EXCEPT が_msgflg_で指定されていない限り、_msgtyp_型のキューの最初のメッセージが読み取られます。その場合、_msgtyp_と等しくない型のキューの最初のメッセージが読み取られます。

_msgtyp_が0未満の場合、_msgtyp_の絶対値以下の最小タイプを持つキュー内の最初のメッセージが読み取られます。

_msgflg_引数は、次のフラグの0個以上の論理和で構成されるビットマスクです。

*IPC_NOWAIT*

要求されたタイプのメッセージがキューにない場合、すぐに戻ります。 システムコールは、_errno_が ENOMSG に設定されて失敗します。

*MSG_EXCEPT*

_msgtyp_とは異なるメッセージタイプのキュー内の最初のメッセージを読み取るために、_msgtyp_が0より大きい場合に使用します。

*MSG_NOERROR*

_msgsz_バイトより長い場合、メッセージテキストを切り捨てます。

要求されたタイプのメッセージが利用できず、_msgflg_で IPC_NOWAIT が指定されていない場合、呼び出しプロセスは次のいずれかの条件が発生するまでブロックされます。

目的のタイプのメッセージがキューに入れられます。

メッセージキューがシステムから削除されます。 この場合、システムコールは_errno_が EIDRM に設定されて失敗します。

呼び出しプロセスはシグナルをキャッチします。 この場合、システムコールは_errno_が EINTR に設定されて失敗します。

正常に完了すると、メッセージキューのデータ構造が次のように更新されます。

_msg_lrpid_は、呼び出しプロセスのプロセスIDに設定されます。

_msg_qnum_は1減少します。

_msg_rtime_は現在の時刻に設定されます。

返り値

失敗すると、両方の関数は-1を返し、_errno_はエラーを示します。それ以外の場合、 msgsnd ()は0を返し、 msgrcv ()は_mtext_配列に実際にコピーされたバイト数を返します。

エラー

*msgsnd* ()が失敗すると、_errno_は次の値のいずれかに設定されます。

Tag

説明

*EACCES*

呼び出しプロセスには、メッセージキューへの書き込み権限がなく、 CAP_IPC_OWNER 機能がありません。

*EAGAIN*

キューの_msg_qbytes_制限のため、メッセージを送信できません。また、_msgflg_で IPC_NOWAIT が指定されました。

*EFAULT*

_msgp_が指すアドレスにアクセスできません。

*EIDRM*

メッセージキューが削除されました。

*EINTR*

メッセージキューがいっぱいの状態でスリープしているときに、プロセスがシグナルをキャッチしました。

*EINVAL*

無効な_msqid_値、または正でない_mtype_値、または無効な_msgsz_値(0未満またはシステム値 MSGMAX より大きい)。

*ENOMEM*

システムには、_msgp_が指すメッセージのコピーを作成するための十分なメモリがありません。

*msgrcv* ()が失敗すると、_errno_は次の値のいずれかに設定されます。
*E2BIG*

メッセージテキストの長さが_msgsz_より大きく、 MSG_NOERROR が_msgflg_に指定されていません。

*EACCES*

呼び出しプロセスには、メッセージキューの読み取り権限がなく、 CAP_IPC_OWNER 機能がありません。

*EAGAIN*

キューでメッセージが利用できず、_msgflg_で IPC_NOWAIT が指定されました。

*EFAULT*

_msgp_が指すアドレスにアクセスできません。

*EIDRM*

プロセスがメッセージを受信するためにスリープしている間に、メッセージキューは削除されました。

*EINTR*

プロセスがメッセージを受信するためにスリープしている間に、プロセスはシグナルをキャッチしました。

*EINVAL*

_msgqid_が無効であるか、_msgsz_が0未満でした。

*ENOMSG*
*IPC_NOWAIT* が_msgflg_で指定され、要求されたタイプのメッセージがメッセージキューに存在しませんでした。

準拠

SVr4、POSIX.1-2001。

ノート

_msgp_引数は、libc4、libc5、glibc 2.0、glibc 2.1で_struct msgbuf _として宣言されます。 SUSv2およびSUSv3での必要に応じて、glibc 2.2以降では_void _として宣言されています。

メッセージキューリソースに関する次の制限は、 msgsnd ()呼び出しに影響します。

Tag

説明

*MSGMAX*

メッセージテキストの最大サイズ:8192バイト(Linuxでは、この制限は_/proc/sys/kernel/msgmax_を介して読み取りおよび変更できます)。

*MSGMNB*

メッセージキューのデフォルトの最大サイズ(バイト単位):16384バイト(Linuxでは、この制限は_/proc/sys/kernel/msgmnb_を介して読み取りおよび変更できます)。 スーパーユーザーは、 msgctl ()システムコールによってメッセージキューのサイズを MSGMNB を超えて増やすことができます。

この実装には、システム全体のメッセージヘッダーの最大数( MSGTQL )およびメッセージプールのバイト単位のシステム全体の最大サイズ( MSGPOOL )に固有の制限はありません。

関連項目

[[File:]] image :http://www.finddevguides.com/images/next.gif [next] [[File:]]

広告

  
Advertisements