|
|
1.1 ! root 1: .ds ZZ DEVELOPMENT PACKAGE ! 2: .TH MSGOP 3L "630 MTG" ! 3: .XE "msgsnd()" ! 4: .XE "msgrcv()" ! 5: .SH NAME ! 6: msgop \- message operations ! 7: .SH SYNOPSIS ! 8: .B #include <message.h> ! 9: ! 10: .B int msgsnd (msqid, msgp, msgsz, msgflg) ! 11: .br ! 12: .B long msqid; ! 13: .br ! 14: .B struct msgbuf \(**msgp; ! 15: .br ! 16: .B int msgsz, msgflg; ! 17: .sp ! 18: \fBint msgrcv (msqid, msgp, msgsz, msgtyp, msgflg)\fR ! 19: .br ! 20: .B long msqid; ! 21: .br ! 22: .B struct msgbuf [\(**]\(**msgp; ! 23: .br ! 24: .B int msgsz; ! 25: .br ! 26: .B long msgtyp; ! 27: .br ! 28: .B int msgflg; ! 29: .SH DESCRIPTION ! 30: .I Msgsnd ! 31: is used to send a message to the queue associated ! 32: with the message queue identifier specified by ! 33: .IR msqid . ! 34: .I Msgp ! 35: points to a structure containing the message. ! 36: This structure is composed of the following members: ! 37: .sp ! 38: .RS 6 ! 39: long mtype; /* message type */ ! 40: .br ! 41: char mtext[]; /* message text */ ! 42: .sp ! 43: .RE ! 44: .I Mtype ! 45: is a positive integer that can be used by the ! 46: receiving process for message selection (see ! 47: .I msgrcv ! 48: below). ! 49: .I Mtext ! 50: is any text of length ! 51: .I msgsz ! 52: bytes. ! 53: .I Msgsz ! 54: can range from 0 to what memory will allow. ! 55: .PP ! 56: .I Msgflg ! 57: specifies the action to be taken if one or more of ! 58: the following are true: ! 59: .sp ! 60: .RS 6 ! 61: The number of bytes already on the queue is equal to ! 62: .BR msg_qbytes . ! 63: .sp ! 64: There is not enough memory to put the message on the queue. ! 65: .sp ! 66: .RE ! 67: These actions are as follows: ! 68: .sp ! 69: .RS 6 ! 70: If ! 71: .RI ( msgflg ! 72: & ! 73: .BR IPC_NOWAIT ) ! 74: is ``true'', the message will not be sent and the ! 75: calling process will return immediately. ! 76: .sp ! 77: If ! 78: .RI ( msgflg ! 79: & ! 80: .BR IPC_NOWAIT ) ! 81: is ``false'', the calling process will suspend ! 82: execution until one of the following occurs: ! 83: .sp ! 84: .RS 6 ! 85: The condition responsible for the suspension no ! 86: longer exists, in which case the message is ! 87: sent. ! 88: .sp ! 89: .I Msqid ! 90: is removed from the system (see ! 91: .IR msgctl ). ! 92: .PP ! 93: .RE 1 ! 94: .I Msgsnd ! 95: will fail and no message will be sent if one or more ! 96: of the following are true: ! 97: .RS 6 ! 98: .sp ! 99: .I Msqid ! 100: is not a valid message queue identifier. ! 101: .sp ! 102: .I Mtype ! 103: is less than 1. ! 104: .sp ! 105: The message cannot be sent for one of the ! 106: reasons cited above and ! 107: .RI ( msgflg ! 108: & ! 109: .BR IPC_NOWAIT ) ! 110: is ``true''. ! 111: .sp ! 112: .I Msgsz ! 113: is less than zero. ! 114: .sp ! 115: .RE ! 116: Upon successful completion, the following actions are taken ! 117: with respect to the data structure associated with ! 118: .IR msqid . ! 119: .sp ! 120: .RS 6 ! 121: .B Msg_qnum ! 122: is incremented by 1. ! 123: .sp ! 124: .B Msg_lspid ! 125: is set equal to the process id of the cal\ ling process. ! 126: .sp ! 127: .B Msg_stime ! 128: is set equal to the current time. ! 129: .RE ! 130: .PP ! 131: An extra feature of ! 132: .I msgsnd ! 133: lets the user send messages without a copy being made. If ! 134: .RI ( msgflg ! 135: & ! 136: .BR NO_COPY ) ! 137: is ``true'', the message pointed to by ! 138: .I msgp ! 139: is put directly ! 140: into the message queue. This can only be done if the ! 141: .I msgbuf ! 142: was allocated (created by a call to alloc). ! 143: This is because the ownership of that memory must ! 144: be changed. The sending process then no longer owns that memory ! 145: and should not try to access it or free it. ! 146: .PP ! 147: .I Msgrcv ! 148: reads a message from the queue associated with the ! 149: message queue identifier specified by ! 150: .I msqid ! 151: and places it in the structure pointed to by ! 152: .IR msgp . ! 153: This structure is composed of the following members: ! 154: .sp ! 155: .RS 6 ! 156: long mtype; /* message type */ ! 157: .br ! 158: char mtext[]; /* message text */ ! 159: .PP ! 160: .RE ! 161: .I Mtype ! 162: is the received message's type as specified by the ! 163: sending process. ! 164: .I Mtext ! 165: is the text of the message. ! 166: .I Msgsz ! 167: specifies the size in bytes of ! 168: .IR mtext . ! 169: The received message is truncated to ! 170: .I msgsz ! 171: bytes if it is larger than ! 172: .I msgsz ! 173: and ! 174: .RI ( msgflg ! 175: & ! 176: .BR MSG_NOERROR ) ! 177: is ``true''. The truncated part of ! 178: the message is lost and no indication of the truncation is ! 179: given to the calling process. ! 180: .PP ! 181: .I Msgtyp ! 182: specifies the type of message requested as follows: ! 183: .RS 6 ! 184: .sp ! 185: If ! 186: .I msgtyp ! 187: is equal to 0, the first message on the queue is received. ! 188: .sp ! 189: If ! 190: .I msgtyp ! 191: is greater than 0, the first message of type ! 192: .I msgtyp ! 193: is received. ! 194: .sp ! 195: If ! 196: .I msgtyp ! 197: is less than 0, the first message of the ! 198: lowest type that is less than or equal to the absolute ! 199: value of ! 200: .I msgtyp ! 201: is received. ! 202: .PP ! 203: .RE ! 204: .I Msgflg ! 205: specifies the action to be taken if a message of the ! 206: desired type is not on the queue. These are as follows: ! 207: .RS 6 ! 208: .sp ! 209: If ! 210: .RI ( msgflg ! 211: & ! 212: .BR IPC_NOWAIT ) ! 213: is ``true'', the calling process will return immediately ! 214: with a return value of -1. ! 215: .sp ! 216: If ! 217: .RI ( msgflg ! 218: & ! 219: .BR IPC_NOWAIT ) ! 220: is ``false'', the calling process will suspend execution ! 221: until one of the following occurs: ! 222: .RS 6 ! 223: .sp ! 224: A message of the desired type is placed on the queue. ! 225: .sp ! 226: .I Msqid ! 227: is removed from the system. When this occurs, ! 228: a value of -1 is returned. ! 229: .PP ! 230: .RE 1 ! 231: .I Msgrcv ! 232: will fail and no message will be received if one or ! 233: more of the following are true: ! 234: .RS 6 ! 235: .sp ! 236: .I Msqid ! 237: is not a valid message queue identifier. ! 238: .sp ! 239: .I Msgsz ! 240: is less than 0. ! 241: .sp ! 242: .I Mtext ! 243: is greater than ! 244: .I msgsz ! 245: and ! 246: .RI ( msgflg ! 247: & ! 248: .BR MSG_NOERROR ) ! 249: is ``false''. ! 250: .sp ! 251: The queue does not contain a message of the ! 252: desired type and ! 253: .RI ( msgtyp ! 254: & ! 255: .BR IPC_NOWAIT ) ! 256: is ``true''. ! 257: .PP ! 258: .RE ! 259: Upon successful completion, the following actions are taken ! 260: with respect to the data structure associated with ! 261: .IR msqid . ! 262: .sp ! 263: .RS 6 ! 264: .B Msg_qnum ! 265: is decremented by 1. ! 266: .sp ! 267: .B Msg_lrpid ! 268: is set equal to the process id of the calling process. ! 269: .sp ! 270: .B Msg_rtime ! 271: is set equal to the current time. ! 272: .PP ! 273: .RE ! 274: Again, the option of not copying the message is available. If ! 275: .RI ( msgflg ! 276: & ! 277: .BR NO_COPY ) ! 278: is ``true'', ! 279: .I msgp ! 280: is treated as a pointer to a pointer to a message. In other words, ! 281: .I *msgp ! 282: is set to the address of the received message. The ownership of the message ! 283: is then set to the receiving process. The receiving process can then ! 284: read the message and free it. ! 285: .PP ! 286: A side effect of \fImsgrcv\fR is that it clears the MSG resource ! 287: ready condition used by the \fIwait\fR and \fIown\fR resource functions. ! 288: .PP ! 289: .SS Return Values ! 290: Upon successful completion, the return value is as follows: ! 291: .sp ! 292: .RS 6 ! 293: .I Msgsnd ! 294: returns a value of 0. ! 295: .sp ! 296: .I Msgrcv ! 297: returns a value equal to the number of bytes ! 298: actually placed into ! 299: .IR mtext . ! 300: .sp ! 301: .RE ! 302: Otherwise, a value of -1 is returned. ! 303: .PP ! 304: .SH SEE ALSO ! 305: alloc(3R), msgctl(3L), msgget(3L), realtime(3R), resources(3R), structures(3R).
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.